我有这个查询
Dasha.Where(x => x[15] == 9).ForEachWithIndex((x,i) => dd[Sex[i]][(int)x[16]]++);
此查询在Dasha
中找到第15个索引值为9的元素,如果是,则递增dd [Dashaindex] [x [16]]值。
这里Dasha是double[100][50]
而dd是double[2][10]
而且Sex是byte []并且只能为0或1. 0表示男性,1表示女性
x [15]只能在0到9之间(包括两者)。 x [16]的规则相同。
它给了我正确的结果。
我尝试将其优化为
Dasha.ForEachWithIndex((x,i) =>
{
if(x[15] == 9)
dd[Sex[i]][(int)x[16]]++
});
这给了我错误的结果。我在哪里做错了?
我的ForEachWithIndex
就像
static void ForEachWithIndex<T>(this IEnumerable<T> enu, Action<T, int> action)
{
int i = 0;
foreach(T item in enu)
action(item, i++);
}
答案 0 :(得分:1)
这只是关于
的部分答案(评论太长) Dasha.ForEachWithIndex((x,i) => {
if(x[15] == 9)
dd[Sex[i]][(int)x[16]]++ });
这给了我错误的结果。我在哪里做错了?
在第一种情况下,您将100个项目的Dasha列表过滤到n个项目,然后迭代这些n个项目。
在第二种情况下,您遍历所有100个项目。所以索引会有所不同,你从Sex [i]得到的每一行的价值会有所不同
e.g。
Dasha[0] != Dasha.Where(x => x[15] == 9)[0]
除非Dasha [0] [15] == 9
答案 1 :(得分:0)
您需要在Where
之前保存原始索引:
Dasha.Select((x,i) => new {x = x, i = i})
.Where(a => a.x[15] == 9)
.ForEach(a => dd[Sex[a.i]][(int)a.x[16]]++);
答案 2 :(得分:0)
以下将给出与第一次查询相同的结果。
int counter=0;
Dasha.ForEachWithIndex((x,i) =>
{
if(x[15] == 9)
{
dd[Sex[counter]][(int)x[16]]++;
counter++;
}
})