C# 如何使用Linq连接GroupBy的结果
假设您有一个项目列表,并且希望对它们进行分区,在一个分区上进行操作,并将分区连接回列表中 例如,有一个数字列表,我想按奇偶性对它们进行划分,然后反转赔率并用偶数连接<代码>[1,2,3,4,5,6,7,8]->[7,5,3,1,2,4,6,8] 听起来很简单,但我一直坚持把两个小组合并起来。你会如何与林克合作C# 如何使用Linq连接GroupBy的结果,c#,linq,C#,Linq,假设您有一个项目列表,并且希望对它们进行分区,在一个分区上进行操作,并将分区连接回列表中 例如,有一个数字列表,我想按奇偶性对它们进行划分,然后反转赔率并用偶数连接[1,2,3,4,5,6,7,8]->[7,5,3,1,2,4,6,8] 听起来很简单,但我一直坚持把两个小组合并起来。你会如何与林克合作 IEnumerable<int> result = Enumerable.Range(0, 1000) .GroupBy(i => i % 2) .Select(
IEnumerable<int> result = Enumerable.Range(0, 1000)
.GroupBy(i => i % 2)
.Select(p => p.Key == 1 ? p.Reverse() : p)
.??? // need to concatenate
IEnumerable结果=可枚举范围(0,1000)
.GroupBy(i=>i%2)
.Select(p=>p.Key==1?p.Reverse():p)
.??? // 需要连接
编辑
[1,2,3]
是数组的表示形式,我想作为结果得到它,而不是输出,很抱歉我把您弄糊涂了。您可以使用以下方法:
如果您不想要字符串,而是想要一个int[]
作为结果:
int[] result = evenOddLookup[1].Reverse().Concat(evenOddLookup[0]).ToArray();
你可以这样做
var number = string.Join(",",
Enumerable.Range(0, 1000)
.GroupBy(i => i % 2) // Separate even/odd numbers
.OrderByDescending(x=>x.Key) // Sort to bring odd numbers first.
.SelectMany(x=> x.Key ==1? // Sort elements based on even or odd.
x.OrderByDescending(s=>s)
: x.Where(s=> s!=0).OrderBy(s=>s))
.ToArray());
string output = string.Format("[{0}]", number);
选中此项,
GroupBy
方法返回一个IEnumerable
。由于i分组
实现了IEnumerable
,您可以使用SelectMany
将多个IEnumerable
实例连接到一个实例中
Enumerable.Range(0, 1000)
.GroupBy(i => i % 2)
.Select(p => p.Key == 1 ? p.Reverse() : p)
.OrderByDescending(p => p.Key)
.SelectMany(p => p);
就像这样使用:
List<int> arr = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8 };
var result = arr.OrderBy(i => i % 2 == 0 ? 1 : 0)
.ThenBy(i => i % 2 == 0 ? i : int.MaxValue)
.ThenByDescending(i => i);
有几种方法可以实现这一点 所以如果我们从你的函数开始
Enumerable.Range(0, 1000)
.GroupBy(i => i % 2)
.Select(p => p.Key == 1 ? p.Reverse() : p)
然后可以使用聚合
.Aggregate((aggrgate,enumerable)=>aggrgate.Concat(enumerable))
这将遍历您的结果列表,并将它们集中到一个集合中并返回它,您只需确保agrgate和enumerable是相同的类型,在本例中是aIEnumerable
另一种方法是调用SelectMany()
然后,这同样会将所有可枚举项合并到一个可枚举项中,再次需要确保类型是IEnumerable
其他选择是按照Tim的建议硬编码键,或者退出linq并使用循环期望的结果是什么?现在是问题描述。我想把
[1,2,3,4,5,6,7,8]
转换成[7,5,3,1,2,4,6,8]
@TimSchmelter[1,2,3]
就是整数的表示或数组。我会更新我的帖子我已经根据你编辑的问题更新了查找是一个有趣的选项,只需要记住两者之间的关系them@klappvisor:查找类似于字典,它总是返回IEnumerable
(如果不可用,则为空)。因此,它具有非常快的查找性能,您可以使用它,而无需再次查询数据源(因此是内存中的集合),这是一个很好的地方,指出最初的问题对于所述任务来说过于复杂,但OQ是如何集中组的结果by@MikeT...Yes. 只要看看OP的评论(我想把[1,2,3,4,5,6,7,8]
转换成[7,5,3,1,2,4,6,8]
),我想这就是OP想要的一切,如果只是简单地使用OrderBy
就应该做他想做的事情。@s.Akbari@MikeT通过GroupBy
实现这一点的替代方案也很有趣,不确定订购是否最佳…@klappvisor…为什么不是最佳的?如果答案的结果是您想要的,请注意,只需使用一个简单的OrderBy
,无需任何进一步的方法、分组和连接,并且…@klappvisor最终您接受了一个答案,它也使用了OrderByDescending。您能解释一下为什么分组和排序应该比我在这里提到的简单的OrderBy
解决方案更优化吗?我只是好奇。使用SelectMany
我无法在赔率第一的时候进行排序,所以我想需要使用Aggregate
。您可以在使用OrderBy
或OrderByDescending
进行SelectMany之前进行排序。我把它加到了答案上。
Enumerable.Range(0, 1000)
.GroupBy(i => i % 2)
.Select(p => p.Key == 1 ? p.Reverse() : p)
.Aggregate((aggrgate,enumerable)=>aggrgate.Concat(enumerable))
.SelectMany(enumerable=>enumerable)