我有一个我创建的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.后来我将在原始图像上显示这些子图像。
我真的很感激任何帮助。
答案 0 :(得分:1)
如果您的数据位于distances
列表中,则可以使用OrderBy
/ GroupBy
,Take
和最后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;