簡體   English   中英

從某列獲取數據表中的行索引

[英]Get row index in datatable from a certain column

| 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解決方案,但我無法弄清楚。

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

您應該能夠像這樣使用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));
}
var index = from row in dt.AsEnumerable()
            let r = row.Field<string>("1")
            where r == "A"
            select dt.Rows.IndexOf(row);

您可以嘗試使用標識列。 但是,我不知道您的應用程序,因此請考慮向您的數據表添加標識列的優點和缺點。 這是一個讓您入門的參考 - 如何添加標識列

希望這可以幫助。

使用linq操作,但為此目標框架應為4.5。 導入system.Data.DataExtensions並應用linq查詢將幫助您。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM