如何使用Linq

时间:2016-06-20 09:17:34

标签: c# linq

假设您有项目列表,并且您想对它们进行分区,在一个分区上进行操作并将分区连接回列表。

例如,有数字列表,我想通过奇偶校验对它们进行分区,然后反转赔率并与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]是数组的表示形式,我想得到结果,而不是输出,抱歉,如果我把你弄糊涂了。

5 个答案:

答案 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]