Domanda

ho un List<string> e ho un DataTable.

Una delle colonne in un DataRow è ID. L'elenco contiene le istanze di questo ID.

Il DataTable viene popolato su un timer.

Voglio tornare voci dalla lista che non sono nella DataTable in un altro elenco.

È stato utile?

Soluzione

Si vuole fare qualcosa di simile

var tableIds = table.Rows.Cast<DataRow>().Select(row => row["ID"].ToString());

var listIds = new List<string> {"1", "2", "3"};

return listIds.Except(tableIds).ToList();

È possibile lanciare le righe nella tabella di dati per essere una raccolta IEnumerable e quindi selezionare il valore della colonna "ID" da ciascuno di essi. È quindi possibile utilizzare il metodo di estensione Enumerable.Except per ottenere tutti i valori dalla lista che non sono nella collezione che hai appena fatto.

Se avete bisogno di ottenere i valori che sono nella tabella ma non nella lista, basta listIds e IDTabelle inverso.

Altri suggerimenti

Se la tabella era qualcosa di simile:

DataTable dt = new DataTable();
dt.Columns.Add("ID");
DataRow dr = dt.NewRow();
dt.PrimaryKey = new DataColumn[] {dt.Columns[0]};
dr["ID"] = "1";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["ID"] = "2";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["ID"] = "3";
dt.Rows.Add(dr);

e l'elenco è stato qualcosa di simile:

List<string> ls = new List<string>{"1","2","4"};

noi potremmo ottenere gli elementi trovati nella lista e non nel DataTable in questo modo:

var v = from r in ls
                where !dt.Rows.Contains(r)
                select r;
        v.ToList();

Con ragionevole efficienza tramite HashSet<T> (e notando che il modo più veloce per ottenere dati da un DataRow è tramite l'indicizzatore DataColumn):

        HashSet<int> ids = new HashSet<int>();
        DataColumn col = table.Columns["ID"];
        foreach (DataRow row in table.Rows)
        {
            ids.Add((int)row[col]);
        }
        var missing = list.Where(item => !ids.Contains(item.ID)).ToList();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top