有内置的方法可以比较集合吗?

时间: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