对列表右侧求和的结果错误

时间:2019-01-26 09:35:47

标签: c# linq

在锻炼过程中,我收到错误的Sum()代码,如下所示:

int right = arr.Where(v => arr.IndexOf(v) > i).Sum();

有人可以解释一下为什么这行不通吗? 例: 像这样的列表:{1、2、3、3} 对于左侧的i = 2:

int left = arr.Where(v => arr.IndexOf(v) < i).Sum();

返回3, 但是对于列表的右侧Sum()= 0 为什么?

4 个答案:

答案 0 :(得分:7)

请注意,IndexOf返回元素第一次出现的索引。
问题在于您的输入列表,因为您有两个3,所以无论何时评估IndexOf(3)时,返回的索引都是2,条件为index > 2显然是忽略了。

答案 1 :(得分:1)

要使用实际索引,有一个different overload of Where也使用该索引。

链接页面中的示例:

int[] numbers = { 0, 30, 20, 15, 90, 85, 40, 75 };

IEnumerable<int> query =
    numbers.Where((number, index) => number <= index * 10);

foreach (int number in query)
{
    Console.WriteLine(number);
}
/*
 This code produces the following output:

 0
 20
 15
 40
*/

答案 2 :(得分:0)

我知道了,问题出在问题上

arr.IndexOf(v)

因为两次v = 3,两次都返回2。 为了更好地增加循环索引或类似内容。

答案 3 :(得分:0)

如果您想知道左侧和右侧的总和。最好使用.Skip()和.Take(),因为index会返回集合中第一次出现的索引。

int right = arr.Skip(i).Sum();
int left = arr.Take(i).Sum(); // including the i-th element

在这种情况下,左侧为1 + 2 = 3,右侧为3 + 3 = 6。