.net 我可以比较两本字典的键吗?

kzmpq1sx  于 2023-07-01  发布在  .NET
关注(0)|答案(7)|浏览(122)

使用C#,我想比较两个字典是具体的,两个字典相同的关键字,但不相同的值,我发现了一个方法比较,但我不太确定我该如何使用它?除了遍历每个键之外,还有其他方法吗?

Dictionary
[
    {key : value}
]

Dictionary1
[
    {key : value2}
]
ybzsozfc

ybzsozfc1#

如果你只想看看键是否不同,但不知道它们是什么,你可以在每个字典的Keys属性上使用SequenceEqual扩展方法:

Dictionary<string,string> dictionary1;
Dictionary<string,string> dictionary2;
var same = dictionary1.Count == dictionary2.Count && dictionary1.Keys.SequenceEqual(dictionary2.Keys);

如果你想要实际的差异,类似这样:

var keysDictionary1HasThat2DoesNot = dictionary1.Keys.Except(dictionary2.Keys);
var keysDictionary2HasThat1DoesNot = dictionary2.Keys.Except(dictionary1.Keys);
tjvv9vkg

tjvv9vkg2#

return dict1.Count == dict2.Count && 
       dict1.Keys.All(dict2.ContainsKey);
pengsaosao

pengsaosao3#

试试这个

public bool SameKeys<TKey, TValue>(IDictionary<TKey, TValue> one, IDictionary<TKey, TValue> two)
{
    if (one.Count != two.Count) 
        return false;
    foreach (var key in one.Keys)
    {
        if (!two.ContainsKey(key))
            return false;
    }
    return true;
}
7gcisfzg

7gcisfzg4#

如果有帮助的话,您可以获取键的集合并对其进行索引。

dictionary1.keys[0] == dictionary2.keys[5]

实际上,我不确定是用数字索引它,还是用键本身索引它,所以两种方法都试试。

deyfvvtc

deyfvvtc5#

你可以这样做(取决于你想要的是intersect还是exclusion):

Dictionary<int, int> dict1 = new Dictionary<int, int>();
Dictionary<int, int> dict2 = new Dictionary<int, int>();

IEnumerable<int> keys1ExceptKeys2 = dict1.Keys.Except(dict2.Keys);
IEnumerable<int> keys2ExceptKeys1 = dict2.Keys.Except(dict1.Keys);
IEnumerable<int> keysIntersect = dict1.Keys.Intersect(dict2.Keys);
5vf7fwbs

5vf7fwbs6#

您可以:

new HashSet<TKey>(dictionary1.Keys).SetEquals(dictionary2.Keys)

如果dictionary1使用与dictionary2不同的比较器,请小心。你必须决定“平等”是否意味着一个或另一个字典认为它的意思(或其他完全)。

wwodge7n

wwodge7n7#

我认为这是最快的方式来检查除了计数键之间的差异。

var isTrue = !dict1.Keys.Any(k => !dict2.Keys.Contains(k)) &&
                         !dict2.Keys.Any(k => !dict1.Keys.Contains(k));

相关问题