web-dev-qa-db-fra.com

Obtenir l'index de ligne dans datatable d'une certaine colonne

| 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.

16
Johan

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

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));
}
3
Yannick Blondeau

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. 

2
Nabheet

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.

0
Jay Sampat