我有两个列表:
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 中另一个。
它有效,但我想简化算法并删除 foreach
和 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
方法与 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/