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の解決策があるはずですが、わかりません。

4

5 に答える 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
于 2012-12-19T12:42:25.103 に答える
5

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));
}
于 2012-12-19T13:09:07.773 に答える
3
var index = from row in dt.AsEnumerable()
            let r = row.Field<string>("1")
            where r == "A"
            select dt.Rows.IndexOf(row);
于 2012-12-19T13:05:39.750 に答える
2

ID列を試すことができます。しかし、私はあなたのアプリケーションを知りませんので、ID 列をデータテーブルに追加することの長所と短所を考慮してください。ここにあなたが始めるためのリファレンスがあります - ID列を追加する方法

お役に立てれば。

于 2012-12-19T12:58:18.910 に答える
0

linq操作を使用しますが、そのためのターゲットフレームワークは4.5である必要があります。system.Data.DataExtensionsをインポートし、linqクエリを適用すると役立ちます。

于 2012-12-19T13:08:17.903 に答える