如题,我有两个简单的语句,打印d:盘下面所有的目录内容,
var path="d:\\";
Array.ForEach(Directory.GetFileSystemEntries(path),(x => Console.WriteLine(x)));//能否改成linq的语句?
我的问题是,能否把Array.ForEach这句调用改成一个linq的语句呢,该怎么改?
------解决思路----------------------
Directory.GetFileSystemEntries(path).ToList().ForEach(x => Console.WriteLine(x));
没法用linq,因为你这个又不是查询之类的操作,你是要foreach
------解决思路----------------------
把foreach改为其实没有什么意义。不过我还是给你写一下吧。
可以随便先写两种
Directory.GetFileSystemEntries(path).Where(x =>
{
Console.WriteLine(x);
return true;
}).Count();
第二种
private bool abc(string x)
{
Console.WriteLine(x);
return true;
}
void test()
{
(from x in Directory.GetFileSystemEntries(path)
where abc(x)
select x).Count();
}
------解决思路----------------------
基本上,Linq就是用来查询的。只不过在推出linq是恰好也推出了List<T>的Foreach扩展方法,所以如果你把下面这个误认为是Linq可能也能令人理解
Directory.GetFileSystemEntries(path)
.ToList()
.ForEach(x =>
{
Console.WriteLine(x);
});
但是这并不是linq。
------解决思路----------------------
linq是一种动态构造查询表达式、延迟计算的方法论。例如
var query1 = from x in Directory.GetFileSystemEntries(path)
where !x.StartsWith("A")
select x;
var query2 = from x in query1
where x.Length > 5
select x;
var query3 = from x in query2
group x by x.Substring(x.Length - 3, 3) into g //根据后3个字符分组
select new { key = g.Key, count = g.Count() };
query3.ToList()
.ForEach(x =>
{
Console.WriteLine("key={0}, count={1}", x.key, x.count);
});
这里,前3个是linq,而ToList也可以算是Linq,而且只有到这个时候才真正开始计算(前边的表达式都并不开始计算,并且不同的linq provider会自动对query1、2、3进行优化,例如可能合并为一条优化的sql表达式)。
ForEach 并不是linq,它只是针对List<T>的扩展方法。它与linq的技术(表达式的连缀、推迟进行查询)其实毫无关系。