在锻炼过程中,我收到错误的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 为什么?
答案 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。