Enumerable.Intersect:http://msdn.microsoft.com/zh-cn/library/bb355408.aspx假如,我自定义了一个比较器,认定两个List<sting>集合相比较,如果其中一个集合的元素完全被包含在另一个集合中,则被认定两个集合相等,比如
List<sting> s1 = new List<sting>(){"0","1","2"};
List<sting> s2 = new List<sting>(){"0","1"};
其中,s2的元素,都包含在s1中,这时,认定s1 == s2问题来了,如果一个List<List<sting>>集合中,有N个List<sting>元素,我要取交集
那返回的是{"0","1","2"};  还是{"0","1"};呢?我要指定返回哪一种,怎么办呢?请指点.....

解决方案 »

  1.   

    昨天让你查MSDN,没有查?
    很简单的,比如我们有个类叫Person,很显然,相同的名字未必是同一个人,但是相同的ID则一定是,我们可以写如下的比较器:
    class Person
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }class PersonComparer : IEqualityComparer<Person>
    {
        public bool Equals(Person x, Person y)
        {
            return x.ID == y.ID;
        }    public int GetHashCode(Person obj)
        {
            return obj.ID.GetHashCode();
        }
    }
    使用:
    List<Person> list1 = ...
    List<Person> list2 = ...
    var result = list1.Intersect(list2, new PersonComparer());
      

  2.   

    你的比较器可以这么写:
    GetHashCode:return string.Join(",", list.OrderBy(x => x).ToArray()).GetHashCode();Equals:return string.Join(",", list1.OrderBy(x => x).ToArray()) == string.Join(",", list2.OrderBy(x => x).ToArray());
      

  3.   

    逻辑有点问题啊,如果a包含b,那么a==b,如果c包含b那么c==b,那么a是否==c呢?
      

  4.   

    所谓相等,必须有3个性质:(1)自反性,a = a
    (2)对称性,a = b,必然 b = a
    (3)传递性,a = b,b = c,必然 a = c。首先把这个原则搞清楚。
      

  5.   

    是这样写的:
    public bool Equals(List<string> list1, List<string> list2)
            {
                int i = 0;    //看看两个集合有多少个元素相同
                foreach (string s in list1)
                {
                    foreach (string s2 in list2)
                    {
                        if (s == s2)
                            i++;
                    }
                }
                if (i == list1.Count || i == list2.Count)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }    你说的那个,我认为也有道理,如果,a和c利用自定义的比较器进行比较的话,显示是不相等的哦,那,你说的也似乎也有道理哦,该咋办呢
      

  6.   

    List<sting> s1 = new List<sting>(){"0","1","2"};
    List<sting> s2 = new List<sting>(){"0","1"};
    这个的交集肯定是{“0”,“1”}啊,看来你没学离散数学吧
    如果其中一个集合的元素完全被包含在另一个集合中,则被认定两个集合相等
    你的假设就是不正确的啊,
    我要指定返回哪一种,怎么办呢?
    他们的Count属性明显不一样的嘛,//你前面已经比较了其中一个被另一个完全包含的话
    if(s1.Count>s2.Count)return s2;
    else
    return s1;
      

  7.   

    我不是求[Quote=引用 6 楼 xiongxyt2 的回复:]List<sting> s1 = new List<sting>(){"0","1","2"};
    List<sting> s2 = new List<sting>(){"0","1"};
    的交集,
      

  8.   

    你知道一个人基本的科学素质是什么么?绝对不要用错误的东西来修正错误。如同走歪了,就纠正过来,而不是喊人把路也改成歪的。你的问题自己写一个判断,然后过滤下就行了。根本和交集扯不上,更不需要Hashcode。
      

  9.   

    本帖最后由 caozhy 于 2011-10-24 22:49:03 编辑
      

  10.   

    本帖最后由 caozhy 于 2011-10-24 22:48:31 编辑
      

  11.   

    哥们,你这个代码,是否必须把{"0","1","2"}写在第一个参数,"0","1"}写在第二个参数,如果在一个大集合
    List<List<sting>>中去随便拿两个比,该咋整呢?
      

  12.   

    本帖最后由 caozhy 于 2011-10-24 22:52:05 编辑
      

  13.   

    其实,我的主要问题还是http://topic.csdn.net/u/20111023/21/b9b05d90-5830-4f8e-a297-5bcd9f726f61.html的问题,
    你告诉,自定义一个比较器,然后,我就去学,IEqualityComparer(Of T) 接口实现类,直到遇到GetHashCode方法重写遇阻,呵呵,好难哦,
      

  14.   

    如果你的问题是 “如何边遍历集合边删除集合元素”的话 
    那你跑偏的不是一点半点你在那个帖子中 暴露的问题是在foreach中对集合进行更改,这是错误的 原因你可以google下
    被你标记为正确答案的也是错误的,老孟在#2给出了正确提示,删除集合元素时要倒序遍历集合
    写个例子测试下明白了。
      

  15.   

    本帖最后由 caozhy 于 2011-10-25 04:01:25 编辑
      

  16.   

    呵呵~ 你使用 list.ToList() 的目的是构建另外实例用于遍历“暴露的问题是在foreach中对集合进行更改”这句话我没说全,完整的应该是“暴露的问题是在foreach中对所遍历集合进行更改”意思就是在foreach中对遍历的实例进行更改是错误的。上面的例子是说明不了“事实上这个问题本身和什么在foreach里面更改元素没有关系”的因为它绕开了在foreach中对遍历的实例进行更改, 反倒是能证明无法在foreach中对遍历的实例进行更改。
      

  17.   

    本帖最后由 caozhy 于 2011-10-25 10:42:28 编辑
      

  18.   

    感谢楼上两位朋友的指教,caozhy朋友的办法,不错,
    不过,我想问一下,如果用倒叙for,下面为什么会报错呢,说,索引值必须为非负数,并小于集合大小
    我的满足啊
    List<List<int>> list = new List<List<int>>() 
    { new List<int>() { 0, 1, 2 }, new List<int>() { 0, 1, 3 }, new List<int>() { 1, 3,8 } };
    List<List<int>> list2 = new List<List<int>>() { new List<int>() { 0, 1}};
    List<List<int>> list3 = new List<List<int>>() { new List<int>() { 2, 1 } };
    List<List<List<int>>> list4 = new List<List<List<int>>>() { list2, list3 };
                for (int i = list.Count; i > 0; i--)
                {
                    if (!list4.All(x => x.All(y => y.All(d => list[i].Contains(d)))))
                    {
                        list.Remove(list[i]);
                    }
                }