标签: igrouping

如何从IGrouping中获取值

我有关于IGrouping和Select()方法的问题.

让我说我有IEnumerable<IGrouping<int, smth>>这样的方式:

var groups = list.GroupBy(x => x.ID);
Run Code Online (Sandbox Code Playgroud)

列表是一个List<smth>.

现在我需要以IGrouping某种方式将每个值传递给另一个列表:

foreach (var v in structure)
{
    v.ListOfSmth = groups.Select(...); // <- ???
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以建议如何List<smth>IGrouping<int, smth>这样的上下文中获取values()吗?

c# linq select igrouping

184
推荐指数
5
解决办法
18万
查看次数

在IGrouping中获取"Value"属性

我有一个类似的数据结构

public DespatchGroup(DateTime despatchDate, List<Products> products);
Run Code Online (Sandbox Code Playgroud)

而我正在努力......

var list = new List<DespatchGroup>();

foreach (var group in dc.GetDespatchedProducts().GroupBy(i => i.DespatchDate))
{
    // group.Values is not correct... how do I write this?
    list.Add(new DespatchGroup(group.Key, group.Values);
}
Run Code Online (Sandbox Code Playgroud)

我显然不理解,IGrouping因为我无法看到如何实际访问组内的数据记录!

c# linq igrouping data-structures

125
推荐指数
4
解决办法
8万
查看次数

ILookup <TKey,TVal>与IGrouping <TKey,TVal>

我一直有麻烦关节之间的差异ILookup<TKey, TVal>IGrouping<TKey, TVal>,并很好奇,如果我理解正确了.LINQ通过生成IGrouping项目序列来复杂化问题,同时也为我提供了ToLookup扩展方法.所以在我仔细观察之前感觉它们是一样的.

var q1 = 
    from n in N
    group n by n.MyKey into g
    select g;
// q1 is IEnumerable<IGrouping<TKey, TVal>>
Run Code Online (Sandbox Code Playgroud)

这相当于:

var q2 = N.GroupBy(n => n.MyKey, n => n);
// q2 is IEnumerable<IGrouping<TKey, TVal>>
Run Code Online (Sandbox Code Playgroud)

这看起来很像:

var q3 = N.ToLookup(n => n.MyKey, n => n);
// q3 is ILookup<TKey, TVal>
Run Code Online (Sandbox Code Playgroud)

我在以下类比中是否正确?

  1. An IGrouping<TKey, TVal>是一个单独的组(即键控序列),类似于KeyValuePair<TKey, TVal>值实际上是一系列元素(而不是单个元素)
  2. 一个IEnumerable<IGrouping<TKey, TVal>>是那些序列(类似于迭代时得到的结果)IDictionary<TKey, TVal>
  3. An ILookup<TKey, TVal>更像是一个IDictionary<TKey, …

c# linq group-by igrouping ilookup

75
推荐指数
3
解决办法
9990
查看次数

IEnumerable <IGrouping>到IEnumerable <List>

所以我有这个:

IEnumerable<IGrouping<UInt64, MyObject>> groupedObjects = myObjectsResults.GroupBy(x => x.Id);

问题是,如何将此结果转换为IEnumerable<List<MyObject>>

这是我可以接受的:

IEnumerable<List<MyObject>> groupedObjects = (myObjectsResults.GroupBy(x => x.Id).SelectMany(group => group).ToList());

这显然是不正确的.有任何想法吗?

c# linq list igrouping

11
推荐指数
2
解决办法
1万
查看次数

LINQ从IGrouping转换为Lookup

我有两个类型ILookup的变量.我想使用Union或Concat组合它们的值并将结果分配给相同类型的第三个变量.Union和Concat都返回IGrouping.将IGrouping转换为ILookup一定很简单,但我不能这样做!:-( IGrouping暴露了Key,所以我正在努力寻找Lookup的第二个参数....任何帮助都会非常多,非常感谢.

linq lambda igrouping ilookup

9
推荐指数
1
解决办法
2315
查看次数

IQueryable IGrouping如何工作

我返回这种类型IQueryable< IGrouping<int, Invoice>> List() 我怎么能用它?喜欢通用List<Invoice>吗?

.net generics list iqueryable igrouping

7
推荐指数
1
解决办法
7591
查看次数

从已经分组的数据结构创建 IGrouping

我有一个 LINQ 问题,这让我有点困惑。我可以看到很多替代方法来找到解决方案,但我想尝试解决问题,因为它困扰着我!

public enum AnimalType {
    Cat,
    Dog,
    Rodent
}

var orderedAnimalTypes = new [] { AnimalType.Rodent, AnimalType.Cat };
Run Code Online (Sandbox Code Playgroud)

我有一个函数GetAnimals(AnimalType type)可以返回给定类型的所有动物。我想获取orderedAnimalTypes并查找该类型的所有动物以创建一个有序的组列表。

我想最终得到一个类型为 的对象IEnumerable<IGrouping<AnimalType, Animal>>。这是一个分组列表,其中Keyis 类型AnimalType和分组的枚举类型为 Animal。

所以我想做的是这个(在将orderedAnimalTypes列表投影到一IEnumerable组之后。

foreach (var group in groups) {
    AnimalType animalType = group.Key;
    IEnumerable<Animal> animals = group.ToArray();
}
Run Code Online (Sandbox Code Playgroud)

我似乎无法使用任何 LINQ 构造来做到这一点。我想我可能需要自己实现 IGrouping 才能做到这一点,但我不确定。

备择方案

  • 我可以很容易地用字典做我想做的事,但它不会被订购。这就是为什么我试图获得一个IEnumerable分组。
  • 我也可以使用匿名类型,但我想将结果分配给 MVC 模型,并且需要强类型。我想要的类型是,IEnumerable<IGrouping<AnimalType, Animal>>但我看不到如何获得该类型。

linq igrouping

5
推荐指数
1
解决办法
1045
查看次数

Linq:创建空 IGrouping

我想使用 Linq 创建一个函数来总结传入的值序列。该函数应该如下所示:

IDictionary<TKey, Summary<TKey>> Summarize<TKey, TValue>(IEnumerable<TValue> values)
{
    return values
        .ToLookup(val => GetKey(val))         // group values by key
        .Union(*an empty grouping*)           // make sure there is a default group
        .ToDictionary(
            group => group.Key,
            group => CreateSummary(group));   // summarize each group
}
Run Code Online (Sandbox Code Playgroud)

问题是,即使传入序列不包含具有该键的值,生成的 IDictionary 也应该有一个 default(TKey) 条目。这可以以纯函数的方式完成吗?(不使用可变数据结构。)

我能想到的唯一方法是在将其输入字典之前调用 .Union 进行查找。但这需要我创建一个空的 IGrouping,如果没有显式类,这似乎是不可能的。有没有一种优雅的方法来做到这一点?

编辑:我们可以假设 TKey 是一种值类型。

linq igrouping ilookup

5
推荐指数
2
解决办法
3506
查看次数

如何从 IGrouping 中获取值?

我在列表上应用了 IGrouping<> - 这是它的样子:

IEnumerable<IGrouping<TierRequest,PingtreeNode>> Tiers
{
    get { return ActiveNodes.GroupBy(x => new TierRequest(x.TierID, x.TierTimeout, x.TierMaxRequests)); }
}
Run Code Online (Sandbox Code Playgroud)

稍后在我的代码中,我遍历层。使用 Key 元素获取关键数据很简单,但是如何获取IEnumerable<PingtreeNode>构成值部分的数据呢?

提前致谢

c# linq igrouping

5
推荐指数
2
解决办法
1万
查看次数

此代码中两个选择器函数的返回值之间的差异

var Students = new Dictionary<string, int>();
Students.Add( "Bob" , 60);
Students.Add( "Jim" , 62);
Students.Add( "Jack", 75);
Students.Add( "John", 81);
Students.Add( "Matt", 60);
Students.Add( "Jill", 72);
Students.Add( "Eric", 83);
Students.Add( "Adam", 60);
Students.Add( "Gary", 75);

var MyVar  = Students.GroupBy(r=> r.Value)
                     .ToDictionary(t=> t.Key, t=> t.Select(x=> x.Key));
Run Code Online (Sandbox Code Playgroud)

Students对象有NameWeight键-值对.

在ToDictionary方法中,t变量是类型IEnumerable<IGrouping<K, T>>.那是,IEnumerable<IGrouping<int, Students>>

为什么Key返回的值t=>t.Keyt=> t.Select(**x=> x.Key**)不同?它们都使用相同的t变量.Key应该是类型int.

图像是在执行GroupBy方法之后拍摄的.(它不是完整图像)其中一个Key具有值,60而另一个具有值 …

c# linq dictionary igrouping

5
推荐指数
1
解决办法
109
查看次数