/ / Odstrániť duplicitné položky z tabuľky údajov, ktoré existujú v inej tabuľke údajov? - c #

Odstraňujete duplicitné položky z DataTable, ktoré existujú v inom DataTable? - c #

Myslíš si, že by to bolo jednoduché, že tam nie jeniečo jednoduché na to? Všetko, čo chcem urobiť, je odstrániť niektoré duplicitné riadky. Samozrejme môžem PK uložiť do samostatného zoznamu a iterovať ním odstránenie riadkov, a nakoniec to možno urobím. Zdá sa, že mi tu chýba nejaké zrejmé riešenie.

        foreach (var v in FinalData.Visitors)
{
bool isDup = (AlreadyCommittedData.Visitors.Any(vdup => vdup.vid == v.vid));
if (isDup)
{
v.Delete();
}
}

Zlyhania s hlásením „zbierka foreach bola upravená, operácia výpočtu sa nemusí vykonať“

O dve minúty neskôr po googlení ... Môj druhý pokus bol niečo ako ...

        var vDup = new LMDB.VisitorsDataTable();

foreach (var v in FinalData.Visitors)
{
bool isDup = (AlreadyCommittedData.Visitors.Any(vdup => vdup.vid == v.vid));
if (isDup)
{
vDup.AddVisitorRow(v);
}
}
foreach (var v in vDup)
{
FinalData.Visitors.Remove(v);
}

Dala mi chybu asi ako ... Riadok existuje v inej tabuľke

Mojím tretím pokusom je jednoduchá hrubá sila;) Pretože duplikáty sú všetky vpredu, môže skutočne dobre fungovať.

// Stále sa testuje, môže ísť o preklep, ak áno, ignorujte ho. bool allDone;

        do
{
allDone = true;
foreach (var v in FinalData.Visitors)
{
bool isDup = (AlreadyCommittedData.Visitors.Any(vdup => vdup.vid == v.vid));
if (isDup)
{
v.Delete();
allDone = false;
break;
}
}

}
while (!allDone);

odpovede:

1 pre odpoveď č. 1

Myslím, že ste na dobrej ceste so svojou druhou možnosťou. Riadok však nikdy nesmie byť vo viac ako jednej tabuľke súčasne. Vyhlásiť, že vdup je zoznam<LMDB.VisitorsDataRow>.


1 pre odpoveď č. 2

Za predpokladu, že máte dve údajové tabuľky (dtA a dtB), chcete získať všetky záznamy v A, ktoré ešte nie sú v B. Ak to chcete urobiť, zlúčte tabuľku A do tabuľky B takto:

dtB.Merge(dtA);
dtA = dtB.GetChanges(); // this will give you records unique to table A
// optional:
dtB.RejectChanges(); // restore dtB to its original state