使用Linq检查C#中的目录
有人能告诉我下面的Linq查询出了什么问题吗?我正试图找到具有最高数值的目录使用Linq检查C#中的目录,c#,linq,C#,Linq,有人能告诉我下面的Linq查询出了什么问题吗?我正试图找到具有最高数值的目录 DirectoryInfo[] diList = currentDirectory.GetDirectories(); var dirs = from eachDir in diList orderby eachDir.FullName descending select
DirectoryInfo[] diList = currentDirectory.GetDirectories();
var dirs = from eachDir in diList
orderby eachDir.FullName descending
select eachDir;
MessageBox.Show(dirs[0].FullName);
编辑:
以上代码未编译,编译器生成的错误为:
Cannot apply indexing with [] to an expression of type 'System.Linq.IOrderedEnumerable<System.IO.DirectoryInfo>
无法将带[]的索引应用于'System.Linq.iorderenumerable'类型的表达式
您试图访问目录,就像它是一个数组或列表一样。它只是一个IEnumerable
。试试这个:
var dirs = diList.OrderByDescending(eachDir => eachDir.FullName);
var first = dirs.FirstOrDefault();
// Now first will be null if there are no directories, or the first one otherwise
请注意,我在这里没有使用查询表达式,因为它对于单个子句来说似乎毫无意义。你也可以把这一切都放在一句话中:
var first = currentDirectory.GetDirectories()
.OrderByDescending(eachDir => eachDir.FullName)
.FirstOrDefault();
使用
这只是不读取错误消息的情况
代码未编译,并生成以下错误消息:
无法将带[]的索引应用于“System.Linq.iorderenumerable”类型的表达式。
换句话说,[…]
部分不使用可枚举项,这是使用Linq查询的结果
您有多种选择,但这里有两种:
- 转换为数组,并拾取第一个元素
- 使用Linq扩展方法获取第一个
我认为第一种方法是一个糟糕的选择,因此下面是第二种方法的代码外观:
DirectoryInfo[] diList = currentDirectory.GetDirectories();
var dirs = from eachDir in diList
orderby eachDir.FullName descending
select eachDir;
var dir = dirs.FirstOrDefault();
if (dir != null)
MessageBox.Show(dir.FullName);
如果您没有使用var
,那么错误的原因将更加清楚
IEnumerable<DirectoryInfo> dirs = from eachDir in diList
orderby eachDir.FullName descending
select eachDir;
MessageBox.Show(dirs[0].FullName);
IEnumerable dirs=来自diList中的每个目录
orderby eachDir.FullName降序
选择每一个;
MessageBox.Show(dirs[0].FullName);
编译器错误不是告诉您问题出在哪里吗?是的-对不起,我已经相应地更新了帖子。这正是我讨厌“var”方法的原因,通过定义您的类型,它变得更加清晰,var关键字感觉像是一个巨大的倒退……不知道是否有什么方法可以让编译器在没有匿名类型的情况下警告使用var。与其说是不理解错误消息,不如说是不读取错误消息
IEnumerable<DirectoryInfo> dirs = from eachDir in diList
orderby eachDir.FullName descending
select eachDir;
MessageBox.Show(dirs[0].FullName);