我有一些像素数学的结果列表如下:
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像素的数据。
答案 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值组成的列表 仅根据该索引选择的值构建新列表。
对我来说没有多大意义。