gpt4 book ai didi

c# - 将字典的键与另一个字典的值进行比较

转载 作者:太空狗 更新时间:2023-10-30 00:37:25 24 4
gpt4 key购买 nike

我有两本字典,类型都是 Dictionary<string, List<List<string>> .我想从字典 1 中选择与字典 2 中的值/条目相匹配的条目范围。

例如字典 1 有键 01, 01.1和字典 2 具有匹配值 01, 01.1.在关键1

首先,我从字典 2 中的键 1 中获取条目,如下所示:

var dictList = (from entry in DbDict
where entry.Key == id.ToString() // id = 1
select entry).ToList();

我试图通过 linq 来选择这些:

var matchingEntries = (from entry in ExcelDict
where ExcelDict.Keys.Equals(dictList[0].Value)
select entry).ToList();

并按照这些思路进行了更多尝试,但它不会返回任何结果。

如何从字典 1 中获取值对的范围,其键与字典 2 的值匹配?

编辑1:

Dictionary 1: 
Key Value
01 "these", "are"
..., ...
01.1 "just", "some"
..., ...
02 "sample", "values"
..., ...

Dictionary 2:
Key Value
1 "01", "01.1"
"foo", "bar"
..., ...
2 "02", "02.21"
"value1" "value2"

编辑2:

预期输出:

"01", "01.1"
"foo", "bar"

编辑3:

评论中要求的可编译输入。这正是我正在处理的结构:

var dict1 = new Dictionary<string, List<List<string>>>();

dict1.Add("01", new List<List<string>> { new List<string> { "these" }, new List<string> { "are" } });
dict1.Add("01.1", new List<List<string>> { new List<string> { "just" }, new List<string> { "some" } });
dict1.Add("02", new List<List<string>> { new List<string> { "sample" }, new List<string> { "values" } });


var dict2 = new Dictionary<string, List<List<string>>>();
dict2.Add("1", new List<List<string>> { new List<string> { "01", "01.1" }, new List<string> { "foo", "bar" } });
dict2.Add("2", new List<List<string>> { new List<string> { "02", "value1" }, new List<string> { "02.21", "value2" } });

编辑4:

抱歉回复晚了。 Gaurang Dave 在评论中的建议和接受的答案都对我有用。感谢大家的帮助!

最佳答案

你写道:

I want to select the range of entries from dictionary 1 which match the values/entries from dictionary 2.

从您在 Edit2 中的输出来看,您似乎想要从字典 2 中获取。您没有对做任何事情。每个值都是一个 List<List<string>> .在您的示例中,具有键 1 的值的第一个列表中的所有字符串在字典 1 中都有相应的键。显然,这是决定完整值在您的输出中的条件。

具有键 2 的值的第一个列表有一个元素不是字典 1 中的键。因此输出中没有任何值。

不清楚:如果第二个列表匹配而不是第一个列表怎么办?

Key     Value
3 "foo", "bar"
"01", "01.1"

这也应该出现在您的最终结果中吗?

不清楚结果你想要一个List<List<string>> , 或者你想要一个大的 List<string>与所有匹配值?重复值怎么办?

假设您只想检查列表列表中的第一个列表:

我们将只查看字典 2 中的值,键被丢弃。然后我们从这个值集合中的每个列表中取出第一个(如果有的话),并作为一个单独的属性记住完整列表。

当然,空列表不应该出现在最终结果中,因此我们只保留那些具有第一个元素的列表:

// Only use the values of dictionary 2:
IEnumerable<List<List<string>>> dict2Values = dictionary2.Values

// then for easy comparison extract the first list
var separatedFirstList = dict2Values.Select(listOfLists=> new
{
FirstList = listOfLists.FirstOrDefault(), // this is a List<string> or null
AllLists = listOfLists, // original List<List<string>> where FirstList is the first
})

// keep only the elements that have a first list:
.Where(stringListWithFirstElement => stringListWithFirstElement.FirstList != null);

到目前为止,我们已经将您的示例字典转换为:

{
FirstString = {"01", "01.1"},
FullList = {"01", "01.1"}, {"foo", "bar"}, {...}, {...},
},
{
FirstString = {"02", "02.21"},
FullList = {"02", "02.21"}, {"value1" "value2"}, ...
},
{
FirstString = ...,
FullList = ...,
},
...

在这个序列中,我们只想保留 FirstString 中的那些 WHERE ALL 元素是 Dictionary 1 的键:

IEnumerable<string> keysDictionary1 = dictionary1.Keys;
var matchingItems = separatedFirstList
.Where(item => item.FirstList.All(txt => keysDictionary1.Contains(txt));

你看到了 Where 和 All。

结果:

{
FirstString = {"01", "01.1"},
FullList = {"01", "01.1"}, {"foo", "bar"}, {...}, {...},
},
...

带有 FirstString = {"02", "02.21"} 的那个被删除,因为不是所有 firstString 的元素都在字典 1 中,

最后:去掉 FirstString:

List<List<String>> finalResult = matchingItems
.Select(matchingItem => matchingItem.FullList);

或者如果您希望结果是一个 List<String> :

List<string> finalResult = matchingItems.SelectMany(matchingItem => matchingItem.FullList);

TODO:考虑创建一个大的 LINQ 语句。由于中间步骤使用惰性执行,我不确定这是否会提高性能。但是我确信它会降低可读性。

关于c# - 将字典的键与另一个字典的值进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51438625/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com