大家好,
今天这是我在我最喜欢的 C# 帮助资源网站上的第一篇文章。我很高兴加入社区。
这是我的问题,我想在使用 .Where 子句过滤双值列表后调用 .Select 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 bloc 上的局部变量通常是动态实例化的(由外部程序集重新调整,来自 National Instruments),这里只是为了让您知道。
例如,相同的行为但带有 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。