c# - 比较两个列表中的项目并用 LINQ 替换 foreach 循环

标签 c# linq for-loop foreach concurrentdictionary

我有两个列表:

   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);
      }
    }
}

如果一个项目的 Name 包含部分内容,则需要将第一个列表中的 Id 添加到第二个列表中的 Id 到 ConcurrentDictionary 中另一个。 它有效,但我想简化算法并删除 foreachif

最佳答案

您可以使用 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 方法与 StringComparison.OrdinalIgnoreCase 一起使用,如下所示:

var found = list2.FirstOrDefault(item => item1Name.IndexOf(item.item2Name, StringComparison.OrdinalIgnoreCase) >= 0);

最后考虑:element.Name 可能已经是字符串类型,除非您的 Item1.Name 属性是某种有趣的类型。如果是这样,element.Name.ToString() 就可以转换为 element.Name

关于c# - 比较两个列表中的项目并用 LINQ 替换 foreach 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60380840/

相关文章:

c# - “Object does not match target type” 用反射调用泛型方法时

c# - 我如何知道word文档中特定文本的字体大小(例如)?

c# - 合并从不同表投影到一个实体的两个可查询对象

c# - 使用 LINQ 简化 foreach 循环(在每次迭代中选择两个对象)

使用 r 中的 for 循环重新调整具有给定不同引用级别的许多变量

c# - 如果引用的对象被删除,引用变量会发生什么?

c# - 在 C# 中 try catch 的不同方法

c# - 如何选择非不同元素及其索引

c - C-如何检查数字出现在数字中的次数

scala - 在 Scala 中使用 Double 进行 for 循环