Вы можете избавиться от внутреннего l oop, используя System.Linq. Также упростите код, используя foreach вместо for для основного l oop:
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
, вероятно, уже имеет тип string, если только свойство Item1.Name
не является забавным типом. Если это так, element.Name.ToString()
конвертируется всего за element.Name
.