我有关于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()吗?
我有一个类似的数据结构
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
因为我无法看到如何实际访问组内的数据记录!
我一直有麻烦关节之间的差异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)
我在以下类比中是否正确?
IGrouping<TKey, TVal>
是一个单独的组(即键控序列),类似于KeyValuePair<TKey, TVal>
值实际上是一系列元素(而不是单个元素)IEnumerable<IGrouping<TKey, TVal>>
是那些序列(类似于迭代时得到的结果)IDictionary<TKey, TVal>
ILookup<TKey, TVal>
更像是一个IDictionary<TKey, …
所以我有这个:
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());
这显然是不正确的.有任何想法吗?
我有两个类型ILookup的变量.我想使用Union或Concat组合它们的值并将结果分配给相同类型的第三个变量.Union和Concat都返回IGrouping.将IGrouping转换为ILookup一定很简单,但我不能这样做!:-( IGrouping暴露了Key,所以我正在努力寻找Lookup的第二个参数....任何帮助都会非常多,非常感谢.
我返回这种类型IQueryable< IGrouping<int, Invoice>> List()
我怎么能用它?喜欢通用List<Invoice>
吗?
我有一个 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>>
。这是一个分组列表,其中Key
is 类型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
分组。IEnumerable<IGrouping<AnimalType, Animal>>
但我看不到如何获得该类型。我想使用 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 是一种值类型。
我在列表上应用了 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>
构成值部分的数据呢?
提前致谢
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
对象有Name
与Weight
键-值对.
在ToDictionary方法中,t
变量是类型IEnumerable<IGrouping<K, T>>
.那是,IEnumerable<IGrouping<int, Students>>
为什么Key
返回的值t=>t.Key
和t=> t.Select(**x=> x.Key**)
不同?它们都使用相同的t
变量.Key
应该是类型int
.
图像是在执行GroupBy方法之后拍摄的.(它不是完整图像)其中一个Key
具有值,60
而另一个具有值 …