Frage

Ich habe ein List<string> Und ich habe ein DataTable.

Eine der Spalten in einem Datarow ist ID. Die Liste enthält Instanzen dieser ID.

Das DataTable wird auf einem Timer besiedelt.

Ich möchte Elemente aus der Liste zurückgeben, die nicht in einer anderen Liste in einer anderen Liste enthalten sind.

War es hilfreich?

Lösung

Sie werden so etwas tun wollen

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

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

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

Sie können die Zeilen in der Datentabelle als eine iEnumerable Sammlung aufnehmen und dann den Spaltenwert "ID" aus jedem von ihnen auswählen. Sie können dann die aufzählbare Erweiterungsmethode verwenden, um alle Werte aus der Liste zu erhalten, die nicht in der gerade erstellten Sammlung enthalten sind.

Wenn Sie die Werte in der Tabelle erhalten müssen, aber nicht in der Liste, einfach umgekehrte ListIds und TableIds.

Andere Tipps

Wenn Ihr Tisch so etwas war:

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);

Und die Liste war so etwas:

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

Wir konnten die Elemente in der Liste und nicht auf diese Weise in der DataTable erhalten:

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

Mit angemessener Effizienz über HashSet<T> (und feststellen, dass der schnellste Weg, Daten aus a zu holen DataRow ist über die DataColumn Indexer):

        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();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top