Linq中的问题to object where子句:绕过了条件
本文关键字:子句 过了 条件 where object 问题 to Linq | 更新日期: 2023-09-27 18:02:53
大家好,
今天,这是我在我最喜欢的C#帮助资源网站上的第一篇文章。我很高兴能加入这个社区。
这是我的问题,我想调用。在使用.Where子句筛选双值列表后,选择linq子句来创建一个结构列表,但筛选条件似乎没有得到评估,或者它们总是返回true
请查看我的代码以更好地理解问题:
string[] msgNames = new string[] { "de", "vf", "ze", "ki", "vt", "er" };
double[] prevCounters = new double[] { 154.0, 24588.0, 4547.0, 788.0, 1455.0, 24577.0 };
double[] counters = new double[] { 8548.0, 54854.0, 54854.0, 44.0, 121.0, 48547.0 };
double[] lenValues = new double[] { 1.0, 2.0, 0.0, 4.0, 5.0, 0.0 };
BufferInfo[] positiveLenValues = counters
.Where((c, it) => lenValues[it] >= 1.0 && prevCounters[it] != c)
.Select((c, it) =>
{
prevCounters[it] = c;
return new BufferInfo()
{
Name = msgNames[it],
Length = lenValues[it]
};
}).ToArray();
也许我误解了linq的用法,但最后返回的BufferInfo[]包含所有值,而lenValues数组中有一些值小于1.0。仅供参考,没有对此代码块的并发访问。。linq块上的局部变量通常是动态设置的(由National Instruments的外部程序集重新调整(,这里只是供您了解。
例如,同样的bahaviour,但有一个For循环,也可以工作:
List<BufferInfo> myInfos = new List<BufferInfo>();
for (int i = 0; i < 6; i++)
{
if (lenValues[i] >= 1.0 && prevCounters[i] != counters[i])
{
oldCounters[i] = counters[i];
myInfos.Add(new BufferInfo()
{
Length = lenValues[i],
Name = msgNames[i]
});
}
}
BufferInfo[] buffers = myInfos.ToArray();
我不在乎是否使用linq,我只想了解它为什么失败
请解释我为什么得到这些奇怪的结果。
致以最良好的问候,
Lun@ir.
这是因为.Select((c, it) =>
再次从0开始索引。。。
因此,如果Where
子句筛选项目并只返回4个项目,则Select
将使用索引0, 1, 2, 3
,该索引与使用Where
返回的项目的索引不对应。
您的代码甚至都没有编译,所以我不知道您是如何测试它不起作用的。。。
您必须先编写Select
以获取索引,然后将其传递到Where
方法:
BufferInfo[] positiveLenValues = counters.Select((c, i) => new { c, i })
.Where(e => lenValues[e.i] >= 1.0 && prevCounters[e.i] != e.c)
.Select(e =>
{
prevCounters[e.i] = e.c;
return new BufferInfo
{
Name = msgNames[e.i],
Length = lenValues[e.i]
};
}).ToArray();
该代码返回4个值,这是可预测的,似乎是正确的结果。