Foreach中的索引

时间:2010-02-24 15:37:20

标签: c# foreach

我目前正在使用foreach,需要该项目的索引。

           foreach (DataRow m_row in base_rows)
       {
           Company nu = new Company(m_row, symb_rows[0]);
       }

这是代码。

我正在尝试在base_rows中获取m_row的索引并使用它来传递symb_rows[index_of_m_row]。这是可能的还是我应该使用正常的for循环?

7 个答案:

答案 0 :(得分:11)

“for”循环解决方案非常清晰。作为一个有趣的替代解决方案,您可以完全避开循环:

var companies = baseRows
  .Select((row, index) => new Company(row, symbRows[index]))
  .ToList();

答案 1 :(得分:7)

为了知道集合中的当前索引(使用foreach),您必须这样做:

Int32 i = 0;
foreach (DataRow m_row in base_rows)
{
    Company nu = new Company(m_row, symb_rows[i]);
    i++;
}

或使用标准for循环。 IEnumerable接口不公开位置索引属性,因为它是基础序列项的仅向前迭代器。

答案 2 :(得分:1)

你必须使用正常的for-loop或创建自己的计数器,就像Andrew Hare建议的那样。我建议使用for循环。

答案 3 :(得分:1)

如果需要索引,可以采用正常的循环方式。

答案 4 :(得分:1)

解决它的绝对最佳方法当然是使用for(){}循环。但你可以搞定时髦并写一个扩展方法:)

public static void ForEachWithIndex<T>(this IEnumerable<T> items, Action<T, int> render)
{
    if (items == null)
        return;
    int i = 0;
    items.ForEach(item => render(item, i++));
}

并且也使用它

base_rows.ForEachWithIndex((m_row, index) => {
    Company nu = new Company(m_row, symb_rows[index]);
});

但话说回来,也许for-loop可以更好地完成工作;)

答案 5 :(得分:0)

我只是使用普通循环。

每次循环时你都可以获得一个增量值,但正常for( int i = 0....将是你最好的选择。

答案 6 :(得分:0)

我可能会考虑像这样使用IndexOf()方法:

foreach(DataRow m_row in base_rows)
    Company nu = new Company(m_row, symb_rows.IndexOf(m_row));

也许你必须使用Array.IndexOf(),这在VBNET2008中工作,因为我正在使用它,但我没有在C#中测试它。

For Each DataRow m_row in base_rows
    Company nu = New Company(m_row, symb_rows(Array.IndexOf(symb_rows, m_row)))
Next

所以我可能会在C#中建议以下内容。

foreach (DataRow m_row in base_rows)
    Company nu = new Company(m_row, symb_rows[Array.IndexOf(symb_rows, m_row)]);

否则,您可能会考虑使用for(;;),有时候最好这样做。

for(int index = 0; index < base_rows.Length && index < symb_rows.Length; ++index)
    Company nu = new Company(base_rows[index], symb_rows[symb_rows.IndexOf(base[index])]);

我不知道你喜欢哪个。