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

16
| 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个回答

10
如果您使用 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

5
您应该能够像下面这样使用DataTable.Select方法:

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

如何将索引用作整数? - CularBytes
IndexOf 返回一个 int - Pete
虽然这个变量仍然是var类型,但如果更改为int类型会出现错误,将索引用作一个期望int类型的方法的变量也会导致错误 :( - CularBytes
1
我假设你的问题在于索引实际上是一个 EnumerableRowCollection<int>?如果你期望只有一条记录并取出该记录中的任何值,比如 int,那么调用者有责任确保这一点。 - Pete
有点是,无法从<int>转换为int,所以我不得不使用foreach,即使它肯定只包含一个记录。改进的提示?我可以直接转换或解析吗? - CularBytes

2
您可以尝试使用标识列。但是,我不知道您的应用程序,请考虑向您的数据表中添加标识列的优缺点。以下是一个参考链接-如何添加标识列
希望这能帮到您。

0

使用linq操作,但需要4.5目标框架。 导入system.Data.DataExtensions并应用linq查询将为您提供帮助。


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