Linq获取与条件匹配的索引列表以过滤另一个列表

时间:2018-01-24 18:15:08

标签: c# linq

我有一些像素数学的结果列表如下:

List<double> MList = new List<double>(new double[]{ 0.002, 0.123, 0.457, 0.237 ,0.1});

我想使用Linq从该列表中检索值低于项的所有项的索引,因此如果要比较的值为0.15,则会产生以下索引: 0,1,4

List<double> MClose = new list<double>();
double compare = 0.15;
List<double> MClose = MList.Where(item => item < compare).Select((item,index) => index);

我希望到目前为止这么好,然后我想使用这个获得的索引,用于对另一个列表。这是一个由RGB值组成的列表,仅用该索引选择的值构建新列表。

class RGB{int r;int g; int b}
list<RGB>=colors = new RGB(){new RGB[,,]{{10,10,2},{13,11,2},{15,16,17},{33,13,2},{35,116,117}}};

我没有经常使用Linq,我想知道这是否可以通过Linq进行编码,甚至可能只是一个班轮?我很好奇答案的答案有多小。 而且(Linq可以快速进行像素编辑),我在这里处理宽度痉挛图,通常是3x3到64x64像素的数据。

3 个答案:

答案 0 :(得分:1)

List<double> MClose = MList.Where(item => item < compare).Select((item,index) => index);

首先,您已将MClose定义为List<double>,但您的最终.Select((item,index) => index)将返回IEnumerable<int> - 这不是List,而是可以迭代的集合。使用var自动推断MClose的类型,并使用.ToList(),以便迭代的结果只被评估一次并被带入内存:

var MClose = MList.Where(item => item < compare).Select((item,index) => index).ToList();

然后您可以将.Where子句与索引一起使用:

var filteredColors = colors.Where((c,index)=> MClose.Contains(index)).ToList();

使用.Contains()仅过滤您在MClose中获得的那些索引。

答案 1 :(得分:0)

您需要重新排序linq方法。首先致电Select,然后致电When

List<double> MList = new List<double>(new double[] { 0.002, 0.123, 0.457, 0.237, 0.1 });
double compare = 0.15;
var idx = MList.Select((x, i) => new {x, i})
    .Where(x => x.x < compare)
    .Select(x => x.i)
    .ToArray();

现在在idx,您将拥有[0,1,4]

一些解释:在您应用Where方法后,您的指数将与原件不同。首先,您需要保存原始索引,然后您可以过滤MList

答案 2 :(得分:0)

  

我想使用Linq从该列表中检索值低于项的所有项的索引,因此如果要比较的值为0.15,则会产生以下索引:0,1,4

您可以使用IndexOf()

获取元素的索引
List<double> list = new List<double> { 0.002, 0.123, 0.457, 0.237, 0.1 };
List<int> indexes = list
    .Where(q => q < 0.15)
    .Select(q => list.IndexOf(q))
    .ToList();
  

我希望到目前为止这么好,然后我想用这个获得的索引来   用于对另一个列表。这是一个由RGB值组成的列表   仅根据该索引选择的值构建新列表。

对我来说没有多大意义。