0

我有这个查询

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++);
}
4

3 回答 3

1

这只是关于的部分答案(评论太长)

 Dasha.ForEachWithIndex((x,i) =>  {
     if(x[15] == 9)
         dd[Sex[i]][(int)x[16]]++ });

这给了我错误的结果。我在哪里做错了?

在第一种情况下,您将包含 100 个项目的 Dasha 列表过滤到 n 个项目,然后遍历这 n 个项目。

在第二种情况下,您遍历所有 100 个项目。所以索引会不同,你从 Sex[i] 得到的每一行的值也会不同

例如

 Dasha[0] != Dasha.Where(x => x[15] == 9)[0] 

除非 Dasha[0][15] == 9

于 2012-05-12T12:05:19.260 回答
0

以下将为您提供与第一次查询相同的结果。

    int counter=0;
    Dasha.ForEachWithIndex((x,i) => 
    {
        if(x[15] == 9)
        {
            dd[Sex[counter]][(int)x[16]]++;
            counter++;
        }
    })
于 2012-05-13T15:59:57.113 回答
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]]++);
于 2012-05-12T12:07:53.273 回答