Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq'的用途是什么;是否使用resultselector重载的GroupBy方法?_C#_Linq - Fatal编程技术网

C# Linq'的用途是什么;是否使用resultselector重载的GroupBy方法?

C# Linq'的用途是什么;是否使用resultselector重载的GroupBy方法?,c#,linq,C#,Linq,在MSDN上,我发现Enumerable.GroupBy方法的以下重载: public static IEnumerable<TResult> GroupBy<TSource, TKey, TElement, TResult>( this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelecto

在MSDN上,我发现Enumerable.GroupBy方法的以下重载:

public static IEnumerable<TResult> GroupBy<TSource, TKey, TElement, TResult>(
this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector,
Func<TSource, TElement> elementSelector,
Func<TKey, IEnumerable<TElement>, TResult> resultSelector)
公共静态IEnumerable GroupBy(
这是一个数不清的来源,
Func键选择器,
Func元素选择器,
Func结果选择器)
以及以下示例:

    List<Pet> petsList =
    new List<Pet>{ new Pet { Name="Barley", Age=8.3 },
                   new Pet { Name="Boots", Age=4.9 },
                   new Pet { Name="Whiskers", Age=1.5 },
                   new Pet { Name="Daisy", Age=4.3 } };

    var query = petsList.GroupBy(
    pet => Math.Floor(pet.Age), //keySelector
    pet => pet.Age,             //elementSelector
    (baseAge, ages) => new      //resultSelector
    {
        Key = baseAge,
        Count = ages.Count(),
        Min = ages.Min(),
        Max = ages.Max()
    });
List petsList=
新列表{新宠物{Name=“大麦”,年龄=8.3},
新宠物{Name=“Boots”,年龄=4.9},
新宠物{Name=“胡须”,年龄=1.5},
新宠物{Name=“Daisy”,年龄=4.3};
var query=petsList.GroupBy(
pet=>Math.Floor(pet.Age),//keySelector
pet=>pet.Age,//elementSelector
(baseAge,ages)=>新建//结果选择器
{
键=基准年龄,
Count=年龄。Count(),
Min=ages.Min(),
Max=ages.Max()
});

虽然我理解这段代码是如何工作的,但我想不出它的实际用途。正如我现在看到的,这将返回一个
可枚举的
,其中在代码末尾定义了匿名类型的元素。但是为什么GroupBy方法会返回一个没有分组的枚举值呢?使用Select、OrderBy等不能实现同样的功能吗。?或者此重载的主要目的是将
字典定义为
TResult
的一部分

以下两个查询将产生相同的结果

var queryA = source
    .GroupBy(x => x.Id)
    .Select(g => new { Id = g.Key, Count = g.Count() });

var queryB = source
    .GroupBy(x => x.Id, (key, g) => new { Id = key, Count = g.Count() });

不同之处在于,第一个查询必须为每个组实例化一个
IGrouping
,而第二个查询没有。在这种情况下,您应该更喜欢
queryB

以下两个查询将产生相同的结果

var queryA = source
    .GroupBy(x => x.Id)
    .Select(g => new { Id = g.Key, Count = g.Count() });

var queryB = source
    .GroupBy(x => x.Id, (key, g) => new { Id = key, Count = g.Count() });

不同之处在于,第一个查询必须为每个组实例化一个
IGrouping
,而第二个查询没有。在这种情况下,您应该更喜欢
queryB

是的,它不做任何不能用
Select()完成的事情。我们甚至可以将其实施为:

public static IEnumerable<TResult> GroupBy<TSource, TKey, TElement, TResult>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, Func<TKey, IEnumerable<TElement>, TResult> resultSelector)
{
  return source.GroupBy(keySelector, elementSelector).Select(grp => resultSelector(grp.Key, grp));
}

/* Repeat in Queryable for IQueryable */
这相当于您引用的示例中基于列表的操作


因此,让
Queryable.GroupBy()
的重载接受
resultSelector
参数是有意义的,当它们在
Queryable
中作用于
IQueryable
时,相应的方法必须在
Enumerable
中作用于
IEnumerable
是,它不做任何不能用
Select()
完成的事情。我们甚至可以将其实施为:

public static IEnumerable<TResult> GroupBy<TSource, TKey, TElement, TResult>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, Func<TKey, IEnumerable<TElement>, TResult> resultSelector)
{
  return source.GroupBy(keySelector, elementSelector).Select(grp => resultSelector(grp.Key, grp));
}

/* Repeat in Queryable for IQueryable */
这相当于您引用的示例中基于列表的操作


因此,让
Queryable.GroupBy()
的重载接受
resultSelector
参数是有意义的,当它们在
Queryable
中作用于
IQueryable
时,相应的方法必须在
Enumerable
中作用于
IEnumerable

中,这样你就可以避免
.GroupBy(…)。选择(…)
,并避免在过程中创建
iGroup
对象,它会立即投射到其他对象中。它在那里,因此您可以避免使用
.GroupBy(…)。选择(…)
,并避免在过程中创建
i分组
对象,而这些对象会立即投射到其他对象中。接受此答案是因为有一个清晰的示例,我没有想到在那些特殊情况下所做的无用的iGroup,谢谢!今天我考虑了这一点,并执行了两个查询
.ToString()
,它实际上生成了完全相同的sql。当然,第二种方法看起来更优雅(但以可读性为代价)@AlexanderDerck只有当
source
IQueryable
时才是如此。如果
source
IEnumerable
,我的答案的最后一段就适用了。我对最后一段很好奇,代码似乎没有确认——首先创建查找,然后应用resultSelector,所以我看不出它与单独应用Select方法有什么不同。我错过什么了吗?接受这个答案是因为有一个清晰的例子,我没有想到在那些特定的案例中所做的无用的I分组,谢谢!今天我考虑了这一点,并执行了两个查询
.ToString()
,它实际上生成了完全相同的sql。当然,第二种方法看起来更优雅(但以可读性为代价)@AlexanderDerck只有当
source
IQueryable
时才是如此。如果
source
IEnumerable
,我的答案的最后一段就适用了。我对最后一段很好奇,代码似乎没有确认——首先创建查找,然后应用resultSelector,所以我看不出它与单独应用Select方法有什么不同。我错过什么了吗?