扩展LINQ的选项

Eli*_*alk 5 .net c# linq

我希望能够在LINQ查询中编写以下内容:

from item in list
collate by item.Property
select item;
Run Code Online (Sandbox Code Playgroud)

要使用此代码,我有以下方法:

public static IEnumerable<T> CollateBy<T,TKey>(
                                 this IEnumerable<T> arr, 
                                 Func<T, TKey> keySelector)
{
    foreach (var group in arr.GroupBy(keySelector))
    {
        foreach (var item in group)
            yield return item;
    }
}
Run Code Online (Sandbox Code Playgroud)

如何编写此方法以使上述查询起作用?

Chr*_*tos 7

你不能这样做.from,in,byselect是C#的关键字.因此,您要求相当于定义自定义关键字,这是不可能的.

对于记录,在查询语法中编写的每个LINQ查询(如您提到的那样)都是在具有相同结果的方法调用中编译的.

例如以下查询:

var adultCustomers = from customer in customers
                     where customer.Age > 18;
Run Code Online (Sandbox Code Playgroud)

相当于以下查询:

var adultCustomers = customers.Where(customer=>customer.Age>18);
Run Code Online (Sandbox Code Playgroud)

在引擎盖下,编译器最初将第一个查询转换为第二个查询.第一个版本只是语法糖.

在您的情况下,您可能需要以下查询(方法语法):

var result = list.CollateBy(item => item.Property);
Run Code Online (Sandbox Code Playgroud)

  • @EliFalk我同意Christos.在过去的十年里,我一直是.NET开发人员.我几乎从来没有看到查询语法,因为考虑到语言的其余部分,它只是不那么可读并且有点奇怪.方法语法更可用和可扩展,更漂亮(在我和我认识的大多数人眼中),它更适合其他语言功能. (4认同)