- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有两本字典,类型都是 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/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!