【发布时间】:2015-09-27 20:41:28
【问题描述】:
我有一个List<float> 和一些NaN。我想通过1 扩展NaN 区域。换句话说,如果我找到一个NaN 元素,我希望前一个和下一个元素也变成NaN。
我编写了一些有效的代码,但在我看来它可以更简单。有什么建议吗?
List<float> l = new List<float>() { float.NaN, 1, 2, 3, float.NaN, float.NaN, float.NaN, 4, 5, 6, float.NaN, 7, 8, float.NaN, 9 };
Console.WriteLine(string.Join(" ", l));
List<float> ll = l.Select(item => item).ToList(); // clone list
for (int i = 0; i < l.Count; i++)
{
if (!float.IsNaN(l[i]))
continue;
if (i > 0)
ll[i - 1] = float.NaN;
ll[i] = float.NaN;
if (i < l.Count - 1)
ll[i + 1] = float.NaN;
}
Console.WriteLine(string.Join(" ", ll));
Console.ReadKey();
输出:
NaN 1 2 3 NaN NaN NaN 4 5 6 NaN 7 8 NaN 9
NaN NaN 2 NaN NaN NaN NaN NaN 5 NaN NaN NaN NaN NaN NaN
【问题讨论】:
-
你不需要
ll[i] = float.NaN;,因为它已经在那里了。 -
l.Select(item => item).ToList();可以是l.ToList()或new List<float>(l) -
确实如此。这些改进稍微简化了代码。
-
需要复制列表吗?我意识到当前的实现要求它避免将数组填充到最后,但如果你能避免这种情况,你不能直接修改集合吗?
-
我可能首先列出 NaN 的索引,然后根据该列表找到应该更改的位置。此列表可能会比复制的列表短。