当前位置: 代码迷 >> C# >> 可不可以把Array.ForEach改成Linq语句
  详细解决方案

可不可以把Array.ForEach改成Linq语句

热度:44   发布时间:2016-05-05 03:22:02.0
能否把Array.ForEach改成Linq语句?
如题,我有两个简单的语句,打印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的技术(表达式的连缀、推迟进行查询)其实毫无关系。
  相关解决方案