有内置的方法可以比较集合吗?
时间:2020-03-05 18:47:32 来源:igfitidea点击:
我想在我的Equals方法中比较几个集合的内容。我有一个词典和一个IList。有内置的方法可以做到这一点吗?
编辑:
我想比较两个字典和两个IList,所以我认为,如果两个字典包含映射到相同值的相同键,则相等是很明显的。
解决方案
回答
不可以,因为该框架不知道如何比较列表的内容。
看看这个:
http://blogs.msdn.com/abhinaba/archive/2005/10/11/479537.aspx
回答
Enumerable.SequenceEqual
Determines whether two sequences are equal by comparing their elements by using a specified IEqualityComparer(T).
我们不能直接比较列表和字典,但是可以将"字典"中的值列表与列表进行比较
回答
看看Enumerable.SequenceEqual方法
var dictionary = new Dictionary<int, string>() {{1, "a"}, {2, "b"}}; var intList = new List<int> {1, 2}; var stringList = new List<string> {"a", "b"}; var test1 = dictionary.Keys.SequenceEqual(intList); var test2 = dictionary.Values.SequenceEqual(stringList);
回答
我不知道Enumerable.SequenceEqual方法(每天都在学习……),但是我建议使用扩展方法。像这样的东西:
public static bool IsEqual(this List<int> InternalList, List<int> ExternalList) { if (InternalList.Count != ExternalList.Count) { return false; } else { for (int i = 0; i < InternalList.Count; i++) { if (InternalList[i] != ExternalList[i]) return false; } } return true; }
有趣的是,花了2秒钟阅读了一下SequenceEqual之后,看来Microsoft已构建了我为我们介绍的功能。
回答
不。收集框架没有任何平等的概念。如果我们考虑一下,则无法比较不是主观的集合。例如,将IList与字典进行比较,如果所有键都在IList中,所有值都在IList中还是两个都在IList中,它们是否相等?没有明显的方法来比较这两个集合,而又不知道它们将用于什么用途,因此通用的equals方法毫无意义。
回答
.NET缺少用于比较集合的任何强大工具。我已经开发了一个简单的解决方案,我们可以在下面的链接中找到:
http://robertbouillon.com/2010/04/29/comparing-collections-in-net/
这将执行相等比较,而不考虑顺序:
var list1 = new[] { "Bill", "Bob", "Sally" }; var list2 = new[] { "Bob", "Bill", "Sally" }; bool isequal = list1.Compare(list2).IsSame;
这将检查是否已添加/删除项目:
var list1 = new[] { "Billy", "Bob" }; var list2 = new[] { "Bob", "Sally" }; var diff = list1.Compare(list2); var onlyinlist1 = diff.Removed; //Billy var onlyinlist2 = diff.Added; //Sally var inbothlists = diff.Equal; //Bob
这将查看字典中的哪些项目已更改:
var original = new Dictionary<int, string>() { { 1, "a" }, { 2, "b" } }; var changed = new Dictionary<int, string>() { { 1, "aaa" }, { 2, "b" } }; var diff = original.Compare(changed, (x, y) => x.Value == y.Value, (x, y) => x.Value == y.Value); foreach (var item in diff.Different) Console.Write("{0} changed to {1}", item.Key.Value, item.Value.Value); //Will output: a changed to aaa