| 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;
}
Existe-t-il un moyen de simplifier ce code pour extraire l'index d'une certaine ligne, avec une colonne fournie? Dans ce cas, l'index sera 0
, puisque je parcours la première colonne jusqu'à trouver "A". On dirait qu'il devrait y avoir une solution linq à cela, mais je ne peux pas le comprendre.
Si vous utilisez la méthode DataTableExtensions.AsEnumerable () , vous pourrez interroger votre DataTable avec LINQ. Vous pouvez ensuite utiliser List<T>.FindIndex
pour déterminer l’index d’un prédicat donné:
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
var index = from row in dt.AsEnumerable()
let r = row.Field<string>("1")
where r == "A"
select dt.Rows.IndexOf(row);
Vous devriez pouvoir utiliser la méthode DataTable.Select
comme ceci:
DataRow[] foundRows;
string filter = "1 == A";
foundRows = dt.Select(filter);
foreach (DataRow dr in foundRows)
{
Console.WriteLine("Index is " + dr.Table.Rows.IndexOf(dr));
}
Vous pouvez essayer une colonne d'identité. Cependant, je ne connais pas votre application, veuillez donc considérer les avantages et les inconvénients de l'ajout d'une colonne d'identité à votre datatable. Voici une référence pour vous aider à démarrer - comment ajouter une colonne d’identité
J'espère que cela t'aides.
Utilisez l'opération linq, mais pour cela votre infrastructure cible doit être 4.5 . Importer system.Data.DataExtensions et appliquer la requête linq vous aidera.