获取ForEach中的当前索引

时间:2014-12-10 14:46:44

标签: c# linq

我有一个频道列表,我的一些频道有未分配的单位,然后传递到一个单独的容器中。我真正想做的是让我的列表中当前位置的索引在我的容器中传递给ForEach调用。我可以用linq做这样的事情,或者我最好使用for..loop吗?

如果可能,我会喜欢使用linq :) 无论如何,这是我的代码:

item.Channels.Where(ch => !ch.IsSkipped).ForEach(
                    ch =>
                        {
                            if (ch.AssignedUnit == null)
                            {
                                //unknownUnitChannels.Add(ch);
                                unknownUnitChannels.Add(index, ch) <== This is the index i'd like to pass there
                            }
                        });

2 个答案:

答案 0 :(得分:4)

如果您想使用原始索引(在应用Where之前),您需要以下内容:

item.Channels.Select((c, i) => new { Channel = c, Index = i })
             .Where(x => !x.Channel.IsSkipped)
             .ForEach(x =>
             /* x.Channel is your item, x.Index is its original Index */
             );

答案 1 :(得分:3)

任何正在ForEach'的东西都不一定有索引。并非每个IEnumerable都由索引存储。

如果你想要一个索引,你可以这样做:

int index = 0;
foreach(var ch in item.Channels.Where(x => x.IsSkipped))
{     
    if (ch.AssignedUnit == null) {
        unknownUnitChannels.Add(index, ch);
    }
    index++;
}

如果您想在过滤前获得索引,请执行以下操作:

int index = 0;
foreach(var ch in item.Channels)
{     
    if (ch.AssignedUnit == null && !x.IsSkipped) {
        unknownUnitChannels.Add(index, ch);
    }
    index++;
}