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"};呢?我要指定返回哪一种,怎么办呢?请指点.....
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"};呢?我要指定返回哪一种,怎么办呢?请指点.....
很简单的,比如我们有个类叫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());
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());
(2)对称性,a = b,必然 b = a
(3)传递性,a = b,b = c,必然 a = c。首先把这个原则搞清楚。
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利用自定义的比较器进行比较的话,显示是不相等的哦,那,你说的也似乎也有道理哦,该咋办呢
List<sting> s2 = new List<sting>(){"0","1"};
这个的交集肯定是{“0”,“1”}啊,看来你没学离散数学吧
如果其中一个集合的元素完全被包含在另一个集合中,则被认定两个集合相等
你的假设就是不正确的啊,
我要指定返回哪一种,怎么办呢?
他们的Count属性明显不一样的嘛,//你前面已经比较了其中一个被另一个完全包含的话
if(s1.Count>s2.Count)return s2;
else
return s1;
List<sting> s2 = new List<sting>(){"0","1"};
的交集,
List<List<sting>>中去随便拿两个比,该咋整呢?
你告诉,自定义一个比较器,然后,我就去学,IEqualityComparer(Of T) 接口实现类,直到遇到GetHashCode方法重写遇阻,呵呵,好难哦,
那你跑偏的不是一点半点你在那个帖子中 暴露的问题是在foreach中对集合进行更改,这是错误的 原因你可以google下
被你标记为正确答案的也是错误的,老孟在#2给出了正确提示,删除集合元素时要倒序遍历集合
写个例子测试下明白了。
不过,我想问一下,如果用倒叙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]);
}
}