【发布时间】:2010-08-18 03:10:51
【问题描述】:
我正在编写一个工具,该工具的第一部分是收集我们公共 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 等价物是什么?
我在哪里使用? - 如何? 我使用群组吗? - 如何?
谢谢。
【问题讨论】:
-
以前从未见过 EnumerateFiles / AllDirectories (msdn.microsoft.com/en-us/library/dd413343%28v=VS.100%29.aspx) - .net 4 的新手,不错。
-
好吧,如果你喜欢就投票吧。 :)
标签: c# linq dictionary linq-to-objects