Я пишу инструмент, и первая часть этого инструмента - собрать все файлы заголовков в нашем общедоступном API. Проблема в том, что два заголовочных файла имеют повторяющиеся имена (но они находятся в разных папках). Это вызовет проблемы при создании словаря.
Первоначально я написал цикл foreach для сбора экземпляров FileInfo в словарь. Однако в последнее время я изучаю LINQ, и я хотел преобразовать цикл foreach в оператор LINQ.
Проблема в том, что когда он выполнялся, он жаловался на дублирующееся имя файла.
Вот оригинальный код:
public Dictionary<String, FileDependency> GetSDKFiles(DirectoryInfo dir)
{
Dictionary<String, FileDependency> list = new Dictionary<String, FileDependency>();
foreach (FileInfo info in dir.EnumerateFiles("*.h", SearchOption.AllDirectories))
{
String key = info.Name.ToLower();
if (list.ContainsKey(key) == false)
{
list.Add(key, new FileDependency(info.FullName));
}
else
{
Debug.Print("Duplicate key: {0}", info.Name);
Debug.Print(" File: {0}", info.FullName);
Debug.Print(" Have: {0}", list[key].FullFileName);
}
}
return list;
}
Который я пытался превратить в LINQ так:
public Dictionary<String, FileDependency> GetSDKFilesLINQ(DirectoryInfo dir)
{
var files = from info in dir.EnumerateFiles("*.h", SearchOption.AllDirectories)
let key = info.Name.ToLower()
let dep = new FileDependency(info.FullName)
select new { key, dep };
return files.ToDictionary(v => v.key, v => v.dep);
}
Однако во время выполнения я получаю это:
Элемент с таким же ключом уже добавлен.
В цикле foreach этого было легко избежать, поскольку я вызвал метод ContainsKey, чтобы убедиться, что у меня нет дубликатов. Но что такое эквивалент LINQ?
Где я использую? - Как?
Я использую группу? - Как?
Спасибо.