从某列获取数据表中的行索引

时间:2012-12-19 12:38:09

标签: c# asp.net sql database

| 1 | 2 | 3 |
+------------+
| A | B | C |
| D | E | F | 
| G | H | I |

System.Data.DataTable dt = new DataTable();

dt.Columns.Add("1");
dt.Columns.Add("2");
dt.Columns.Add("3");
dt.Rows.Add(new object[] { "A", "B", "C" });
dt.Rows.Add(new object[] { "D", "E", "F" });
dt.Rows.Add(new object[] { "G", "H", "I" });

int? index = null;

var rows = new System.Data.DataView(dt).ToTable(false, new[] {"1"}).Rows;

for (var i = 0; i < rows.Count; i++)
{
    if (rows[i].ItemArray.FirstOrDefault() as string == "A")
        index = i;
}

有没有办法简化此代码以获取某一行的索引,并提供一列?在这种情况下,索引将是0,因为我正在迭代第一列,直到找到“A”。感觉应该有一个linq解决方案,但我无法弄明白。

5 个答案:

答案 0 :(得分:9)

如果您使用DataTableExtensions.AsEnumerable()方法,则可以使用LINQ查询DataTable。然后,您可以使用List<T>.FindIndex来确定给定谓词的索引:

int? index = new System.Data.DataView(dt).ToTable(false, new[] { "1" })
                .AsEnumerable()
                .Select(row => row.Field<string>("1")) // ie. project the col(s) needed
                .ToList()
                .FindIndex(col => col == "G"); // returns 2

答案 1 :(得分:3)

var index = from row in dt.AsEnumerable()
            let r = row.Field<string>("1")
            where r == "A"
            select dt.Rows.IndexOf(row);

答案 2 :(得分:3)

您应该可以使用DataTable.Select方法,如下所示:

DataRow[] foundRows;
string filter = "1 == A";
foundRows = dt.Select(filter);

foreach (DataRow dr in foundRows)
{
    Console.WriteLine("Index is " + dr.Table.Rows.IndexOf(dr));
}

答案 3 :(得分:2)

您可以尝试使用标识列。但是,我不知道您的应用程序,因此请考虑向您的数据表添加标识列的优点和缺点。以下是帮助您入门的参考资料 - how to add identity column

希望这会有所帮助。

答案 4 :(得分:0)

使用linq操作,但为此目标框架应为4.5。 导入system.Data.DataExtensions并应用linq查询将帮助你。