Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何验证是否所有字典KVP都包含在列表中的其他一些字典中_C#_.net_Linq - Fatal编程技术网

C# 如何验证是否所有字典KVP都包含在列表中的其他一些字典中

C# 如何验证是否所有字典KVP都包含在列表中的其他一些字典中,c#,.net,linq,C#,.net,Linq,我有一个字典A(假设包含3个KVP)和一个包含许多KVP的字典列表。我需要验证是否有某个字典包含字典A中的所有KVP 字典A-3KVP 列表A包括3个字典,每个字典包含20KVP 如何验证列表A中是否有任何字典包含字典A中的所有KVP?使用LINQ的any和all方法,检查列表中的任何字典是否包含另一个字典的所有键/值对非常简单 类似于以下的操作可以做到这一点: var result = list.Any(d => dict.All(x => d.ContainsKey(x.Key)

我有一个字典A(假设包含3个KVP)和一个包含许多KVP的字典列表。我需要验证是否有某个字典包含字典A中的所有KVP

字典A-3KVP

列表A包括3个字典,每个字典包含20KVP


如何验证列表A中是否有任何字典包含字典A中的所有KVP?

使用LINQ的
any
all
方法,检查列表中的任何字典是否包含另一个字典的所有键/值对非常简单

类似于以下的操作可以做到这一点:

var result = list.Any(d => dict.All(x => d.ContainsKey(x.Key) && d[x.Key] == x.Value));
这将检查列表中的任何字典是否具有与目标字典值相同的所有键

正如@mjwills在注释中指出的那样,通过使用Dictionary的TryGetValue方法,可以避免多次查找。如下所示:

var result = list.Any(d => dict.All(x => d.TryGetValue(x.Key, out var val) && val == x.Value));
这假设某些值看起来像这样:

var list = new List<Dictionary<string,string>> {
    new Dictionary<string,string> {
        {"1","1"},
        {"2","2"},
        {"3","3"}
    },
    new Dictionary<string,string> {
        {"4","4"},
        {"5","5"},
        {"6","6"}
    },
    new Dictionary<string,string> {
        {"7","7"},
        {"8","8"},
        {"9","9"}
    }
};

var dict = 
    new Dictionary<string,string> {
        {"7","7"},
        {"8","8"},
        {"9","9"}
    };
var list=新列表{
新词典{
{"1","1"},
{"2","2"},
{"3","3"}
},
新词典{
{"4","4"},
{"5","5"},
{"6","6"}
},
新词典{
{"7","7"},
{"8","8"},
{"9","9"}
}
};
变量dict=
新词典{
{"7","7"},
{"8","8"},
{"9","9"}
};

使用LINQ的
any
all
方法,检查列表中的任何词典是否包含另一个词典的所有键/值对非常简单

类似于以下的操作可以做到这一点:

var result = list.Any(d => dict.All(x => d.ContainsKey(x.Key) && d[x.Key] == x.Value));
这将检查列表中的任何字典是否具有与目标字典值相同的所有键

正如@mjwills在注释中指出的那样,通过使用Dictionary的TryGetValue方法,可以避免多次查找。如下所示:

var result = list.Any(d => dict.All(x => d.TryGetValue(x.Key, out var val) && val == x.Value));
这假设某些值看起来像这样:

var list = new List<Dictionary<string,string>> {
    new Dictionary<string,string> {
        {"1","1"},
        {"2","2"},
        {"3","3"}
    },
    new Dictionary<string,string> {
        {"4","4"},
        {"5","5"},
        {"6","6"}
    },
    new Dictionary<string,string> {
        {"7","7"},
        {"8","8"},
        {"9","9"}
    }
};

var dict = 
    new Dictionary<string,string> {
        {"7","7"},
        {"8","8"},
        {"9","9"}
    };
var list=新列表{
新词典{
{"1","1"},
{"2","2"},
{"3","3"}
},
新词典{
{"4","4"},
{"5","5"},
{"6","6"}
},
新词典{
{"7","7"},
{"8","8"},
{"9","9"}
}
};
变量dict=
新字典{
{"7","7"},
{"8","8"},
{"9","9"}
};

正确答案将取决于
键和
值的类型(如果其中一个是
列表,例如,相等比较比较比较困难),但一般来说,假设所有键和值的
相等
GetHashCode
方法都正确实现
,我们可以使用
系统.Linq
扩展方法
任何
之外的方法来获得结果

Except
方法返回第一个集合(
compareDict
)中不在第二个集合(列表中的字典)中的所有项:

这表示,“如果在检查比较字典中所有项目与列表中每个字典之间的差异时,至少一次比较中没有来自比较字典的剩余项目(否则返回
false
),则返回
true


这是因为
字典实现了
IEnumerable
,和
KeyValuePair
实现
等于
,如果
相等,则返回
true

正确答案取决于
部分的类型(例如,如果其中一个是
列表
,那么equals比较就比较棘手),但一般来说,假设所有键和值的
都等于
GetHashCode
方法都正确实现了,我们可以使用
系统.Linq
扩展方法
任何
之外的方法来获得结果

Except
方法返回第一个集合(
compareDict
)中不在第二个集合(列表中的字典)中的所有项:

这表示,“如果在检查比较字典中所有项目与列表中每个字典之间的差异时,至少一次比较中没有来自比较字典的剩余项目(否则返回
false
),则返回
true


这是因为
字典
实现了
IEnumerable
,而
KeyValuePair
实现了
等于
,这样如果
键和
值都相等,它就会返回
true

这不会将字典用作
IEnumerable
,并失去con>的好处吗固定时间查找?这难道不会将字典用作
IEnumerable
,从而失去固定时间查找的好处吗?