繁体   English   中英

此linq查询能否更有效?

[英]Can this linq query be more efficient?

我是linq的新手,现在越来越多地使用它来熟悉。 我只是用以下linq语句替换了一堆基于字典的丑陋分组和计数代码:

using System;
using System.Linq;

namespace WindowsForms_TestBench
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            string[] numbers = new string[] { "1", "2", "1", "1", "3", "2", "1" };

            var groupedNumbers =
                from number in numbers
                group number by number into grouped
                select new { Number = grouped.Key, Count = grouped.Count() };

            foreach (var groupedNumber in groupedNumbers)
                Console.WriteLine("{0}({1})", groupedNumber.Number,     groupedNumber.Count);
        }
    }
}

非常简单,它在做什么,但我只是好奇是否有人发现一种更有效的方法,或者您认为是“更好”的方法来完成相同的输出。

除了争论语法以及是否使用函数样式和查询语法(您使用查询语法)之外,它没有更多的内容。

您已经按照标准方式进行了分组和计数,并且(除非您比大多数开发人员更深入地研究),您不太可能找到“更好”的方式。

仅用于提供信息,其功能语法为:

foreach (var group in numbers.GroupBy(number => number))
{
    Console.WriteLine("{0}({1})", group.Key, group.Count());
}

不,对我来说,这看起来非常有效,紧凑且可读。

如果您关心速度,则可以添加AsParallel()

  • 但是对于小数据集,这会使性能变差!
  • 并与groupby一起使用Parallel可能会增加对更多内存的需求

不,那几乎是最合理的方法。 在内部,它正在创建一个哈希表来存储计数,因此性能可能类似于您的旧方法。

该查询非常适合您的工作(并且可能是获取所需信息的最有效的LINQ语句)。

请记住,您使用的是查询语法,因此看起来有些冗长,但效率也不低。

等效的lambda语法如下所示:

var results = numbers.GroupBy(n => n)
                     .Select(g => new { g.Key, Count = g.Count() });

它看起来更紧凑,但功能完全相同。

我将下面的代码转换为Lambda语法

var groupedNumbers =
            from number in numbers
            group number by number into grouped
            select new { Number = grouped.Key, Count = grouped.Count() };

回应@Matt Greer

Lambda语法:

var groupedNumbers = number.GroupBy(x=> x.number).Select(x=> new
                           {
                             Number = x.Key,
                             Count = x.Count()
                            });

这可能不是正确的翻译,但可以证明这一点。

为了进一步推动John Fisher的功能示例 ,您可以采用:

static void Main()
{
    string[] numbers = new string[] { "1", "2", "1", "1", "3", "2", "1" };

    (from number in numbers
     group number by number into grouped
     select new { Number = grouped.Key, Count = grouped.Count() }
    ).ToList().ForEach(
         group => Console.WriteLine("{0}({1})", group.Number, group.Count)
    );
}

但是,您必须使用ToList()方法,因为IEnumerable不提供ForEach接口(有关此主题的讨论,请参见“ IEnumerable的LINQ等效于foreach ”)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM