c# - 比较两个列表中的项目并用 LINQ 替换 foreach 循环
问题描述
我有两个列表:
List<Item1> list1;
List<Item2> list2;
我有以下代码用于比较列表中的项目:
ConcurrentDictionary<string, string> compareDictionary = new ConcurrentDictionary<string, string>();
for (int i = 0; i < lis1.Count; i++)
{
var item1Name= list1[i].Name.ToString();
var item1Id= list1[i].ID.ToString();
foreach (var item in list2)
{
if (item1Name.Contains(item.item2Name.ToLower()))
{
compareDictionary.TryAdd(item1Id, item.item2Id);
}
}
}
如果一个项目包含另一个项目的一部分,则需要Id
从第一个列表中添加Id
第二个列表到 ConcurrentDictionary 。Name
它有效,但我想简化算法并删除foreach
and if
。
解决方案
您可以使用 System.Linq 摆脱内部循环。还可以通过使用 foreach 而不是 for for 主循环来简化代码:
ConcurrentDictionary<string, string> compareDictionary = new ConcurrentDictionary<string, string>();
foreach (var element in list1)
{
var item1Name= element.Name.ToString();
var item1Id= element.ID.ToString();
// If this element has already one correspondence, TryAdd will fail anyway
if(compareDictionary.ContainsKey(item1Id)) continue;
var found = list2.FirstOrDefault(item => item1Name.Contains(item.item2Name.ToLower()));
if(found != null)
{
compareDictionary.TryAdd(item1Id, item.item2Id);
}
}
根据您的元素命名,您还可能需要将 item1Name 设为小写。您的代码实际上会找到这种对应关系:
Parentwithlittlechild --> LittleChild
但不是这个:
ParentWithLittleChild --> LittleChild
因为 "LittleChild" 会小写,并且 String.Contains 默认情况下区分大小写。您也可以使用IndexOf
with 方法StringComparison.OrdinalIgnoreCase
,如下所示:
var found = list2.FirstOrDefault(item => item1Name.IndexOf(item.item2Name, StringComparison.OrdinalIgnoreCase) >= 0);
最后的考虑:element.Name
可能已经是字符串类型,除非你的Item1.Name
属性是一些有趣的类型。如果element.Name.ToString()
是这样,则可转换为element.Name
.
推荐阅读
- reactjs - 如何将(手动)接口构造从 React tsx 翻译成 React jsx?
- triggers - 在 arm 模板中使用时区触发 azure 数据工厂无法正常工作
- reactjs - 使用 DualList 组件呈现和添加数据时出现问题
- firebase - Firebase 可调用函数失败
- typescript - 打字稿扩展原始类型
- javascript - 打字稿。未捕获的 ReferenceError:显示未在 HTMLInputElement.onchange 中定义
- sql - SQL 表中的重复项:如何根据行值映射重复项?
- spring-webflux - 如何验证 Webflux/Webclient 中的错误正文
- c++ - 当我在函数中定义时,cpp 组合中没有定义
- python - python 编码新手,尝试使用 python 包 pyautogui 在我的 chromebook 上制作我自己的宏;运行程序什么都没有发生没有错误