DataTable - 遍历行,除了第一行

10

我在我的应用程序中使用了一个DataTable进行一些计算。我需要遍历除第一行以外的所有行。这是否可能?

类似这样:

DataTable dt;

foreach (DataRow r in dt.Rows /*EXCEPT THE FIRST ONE*/)
{
    //do something...
}
3个回答

32

LINQ是你的好朋友:

DataTable dt;
foreach (DataRow r in dt.Rows.Cast<DataRow>().Skip(1))
{
    //do something...
}

这里需要调用Cast()方法,因为DataTable.Rows实现了非泛型的IEnumerable接口,而LINQ扩展方法只能用于IEnumerable<T>

你还有另一个选择:

DataTable dt;
foreach (DataRow r in dt.AsEnumerable().Skip(1))
{
    //do something...
}

哦,只有一件事...应该不是.Skip(0)吗? - user1080533
4
不应该改变,因为 Skip 接受要忽略的项目数量。 - Nuffin
我错过了什么 - 我在DataTable.Rows中没有看到Skip方法。 - Jay Riggs
1
@JayRiggs 我刚刚注意到 DataTable.Rows 返回的是非泛型的 IEnumerable,所以为了使用 LINQ,需要调用 Cast()。我已经相应地更新了我的答案。 - Adi Lester

16

好的,你已经得到了答案,但如果你不想使用Linq,则可以检查表格中行的索引:

            foreach (DataRow row in m_dtMatrix.Rows)
            {
                if (m_dtMatrix.Rows.IndexOf(row) != 0)
                {
                    ...
                }
            }

1
你需要小心,因为我认为“第一”行取决于数据表的排序定义。 - Orkun
最终我决定不使用LINQ,所以我采用了你的答案。感谢大家的回复。 - user1080533
虽然这是被接受的答案(也是一个有效的答案),但检查每一行是否不是第一个并不理想,@Adi跳过第一行的方法更加简明、清晰。 - Alan

2
这里是一个快速而简单的示例。
DataTable dt;

bool isFirst = true;

foreach (DataRow r in dt.Rows /*EXCEPT THE FIRST ONE*/)
{
    if( isFirst ) {
        isFirst = false;
        continue;
    }
    //do something...
}

3
该怎么翻译呢? "该死的莱斯特,现在我看起来像个初学者。" - Matthew
我已经做了多年的编程,甚至从未注意到Skip()方法。不要感到难过。 :) - DevOhrion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接