C#分组或其他什么?

时间:2011-05-04 15:33:31

标签: c# list

我有一个我创建的RGBComparison类型列表。它具有欧氏距离,id,本地id等作为变量。 按距离对List进行排序后,我得到这样的输出;

1.35363 id=3 
1.43554 id=2 
1.4556  id=3
1.5  id = 35
1.6 id = 2

======================================

等。它们是来自输入子图像的子图像的欧氏距离(变量名称距离)。我想通过保留原始订单来对它们进行分组。考虑距图像id 1有8个距离(图像id 1是最接近的,列表中的第1个)。我想要一个像

这样的输出
    1.35363 id=3
    1.4556  id=3
    1.43554 id=2
    1.6 id=2
    1.5 id = 35

....

有办法做到这一点吗?此外,我只会从输入中获取最多5个距离。例如,如果id 1在List中有8个子图像距离,那么我将只取第一个5.后来我将在原始图像上显示这些子图像。

我真的很感激任何帮助。

2 个答案:

答案 0 :(得分:1)

如果您的数据位于distances列表中,则可以使用OrderBy / GroupByTake和最后SelectMany的组合来展平结果列表:

var results = distances.OrderBy( x=> x.Id)
                       .GroupBy(x => x.Id)
                       .Select(g => g.OrderBy(x => x.Distance).Take(5))
                       .SelectMany(x => x)
                       .ToList() ;

要将每个Id的距离数量限制为5 max,您需要进行分组,在分组之前也要使用OrderBy来引导分组保留的正确的Ids顺序。

编辑以回应评论和澄清:

   var results = distances.GroupBy(x => x.Id)
                          .Select(g => g.OrderBy(x => x.Distance).Take(5))
                          .SelectMany(x => x)
                          .OrderBy( x=> x.Distance)
                          .ToList();

这应该给你一个按距离排序的列表,任何id最多5个元素。

答案 1 :(得分:0)

您可以使用LINQ轻松地对列表进行排序

var myRGBComparisonList = new List<RGBComparison>();
//... populate list somewhere
var sortedSequence = from rgbComparison in myRGBComparisonList
                     orderby rgbComparison.ID ascending, rgbComparison.Distance ascending
                     select rgbComparison;