假设您有项目列表,并且您想对它们进行分区,在一个分区上进行操作并将分区连接回列表。
例如,有数字列表,我想通过奇偶校验对它们进行分区,然后反转赔率并与evens连接。 [1,2,3,4,5,6,7,8] -> [7,5,3,1,2,4,6,8]
听起来很简单,但我仍然坚持要合并两组。你会怎么用LINQ做的?
IEnumerable<int> result = Enumerable.Range(0, 1000)
.GroupBy(i => i % 2)
.Select(p => p.Key == 1 ? p.Reverse() : p)
.??? // need to concatenate
修改
[1,2,3]
是数组的表示形式,我想得到结果,而不是输出,抱歉,如果我把你弄糊涂了。
答案 0 :(得分:2)
orders
方法返回GroupBy
。当IEnumerable<IGrouping<TKey, TSource>>
实现IGrouping
时,您可以使用IEnumerable
将多个SelectMany
实例连接成一个。
IEnumerable<T>
答案 1 :(得分:1)
您可以使用Lookup<TKey, TElement>
:
var evenOddLookup = numbers.ToLookup(i => i % 2);
string result = String.Join(",", evenOddLookup[1].Reverse().Concat(evenOddLookup[0]));
如果您不想要字符串,但结果为int[]
:
int[] result = evenOddLookup[1].Reverse().Concat(evenOddLookup[0]).ToArray();
答案 2 :(得分:1)
有几种方法可以实现这一目标,
所以如果我们从你的功能开始
Enumerable.Range(0, 1000)
.GroupBy(i => i % 2)
.Select(p => p.Key == 1 ? p.Reverse() : p)
然后你可以使用聚合
.Aggregate((aggrgate,enumerable)=>aggrgate.Concat(enumerable))
然后,这将通过你的结果列表并将它们全部串联到一个集合中并返回它,你只需要确保aggrgate和enumerable在这种情况下是相同的类型IEnumerable<int>
另一种方法是调用SelectMany()
.SelectMany(enumerable=>enumerable)
然后同样将所有可枚举的内容整合到一个可枚举中,同样需要确保类型为IEnumerable<int>
其他选项是在Tim建议或退出linq并使用循环时对密钥进行硬编码
答案 3 :(得分:0)
你可以这样做。
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);
选中此Demo
答案 4 :(得分:0)
只需像这样使用OrderBy
:
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);
这应该可以根据需要为您提供所需的结果:
[1,2,3,4,5,6,7,8] will be converted into [7,5,3,1,2,4,6,8]