Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Dotazovací jazyk LINQ - jak realizovat řešení

Ahoj,

jsem tu znova a tentokrát naposledy. Mám dotaz na řešení dílčího problému.
Mám dvě LINQové proměnné, které obsahují položky.

Každá položka obsahuje SKUPINU a ČÍSLO.

Řekněme, že položka vypadá takto:

 public class CustomClass
        {
            public string SKUPINA { get; set; }
            public int CISLO { get; set; }
        }

A těchto položek mám dvě LINQ kolekce nějak takto:

var list1 = new List<CustomClass> { 
		new CustomClass { SKUPINA = "a", CISLO = 100 },
		new CustomClass { SKUPINA = "a", CISLO = 101 },
		new CustomClass { SKUPINA = "c", CISLO = 200 },
		new CustomClass { SKUPINA = "d", CISLO = 300 }
	};
	var list2 = new List<CustomClass> {
		new CustomClass { SKUPINA = "a", CISLO = 109 },
		new CustomClass { SKUPINA = "b", CISLO = 400 },
		new CustomClass { SKUPINA = "e", CISLO = 500 },
		new CustomClass { SKUPINA = "f", CISLO = 600 }
	};

A potřebuji dosáhnout následujícího:
Abych získal třetí kolekci, která bude obsahovat pouze to, co je v kolekci list2 a co je navíc v kolekci list1.

Výsledkem by tedy měly být tyto položky (tato kolekce):

        new CustomClass { SKUPINA = "a", CISLO = 102 },
		new CustomClass { SKUPINA = "b", CISLO = 400 },
		new CustomClass { SKUPINA = "e", CISLO = 500 },
		new CustomClass { SKUPINA = "f", CISLO = 600 }

Tento problém tedy vypadá v podstatě hodně jednoduše, že vezmeme List2 a přidáme k němu to, co obsahuje List1 navíc.
Takovouto kolekci již mám.
Toto umím provést, ale jde o to, aby vlastnost CISLO pokračovala tam, kde v Listu1 zkončilo číslování.
Což jak vidíme bylo v list1 číslo 101, proto ve výsledné kolekci je to číslo 102.
Toto se ale týká samozřejmě jen společných skupin.

Pokud tento dotaz zapadne, bude uzamčen a nebo smazán, nebudu se zlobit :-)
Díky za přečtení.

Předmět Autor Datum
Kam ti zmizely skupiny "c" a "d" z list1? Co se má stát, když tím přečíslováním dojde ke kolizi s ji…
Wikan 06.05.2014 11:30
Wikan
Takto ten výsledný příklad je správně. c a d reprezentuje staré součástky, které byly nahrazeny a ne…
Console 06.05.2014 11:51
Console
var list1Distinct = from l in list1 group l by l.SKUPINA into g select new CustomClass { SKUPINA = g…
Wikan 06.05.2014 12:10
Wikan
No to je úžasné. Hned to jdu testovat. poslední
Console 06.05.2014 12:50
Console

Kam ti zmizely skupiny "c" a "d" z list1? Co se má stát, když tím přečíslováním dojde ke kolizi s jiným číslem? Skupinu "a" máš v list1 dvakrát pod jiným číslem, to tak má být?
BTW: "LINQová proměnná" je nesmyslný pojem, stejně jako "LINQ kolekce"

Takto ten výsledný příklad je správně.
c a d reprezentuje staré součástky, které byly nahrazeny a nebudou se používat (v novém návrhu).
Možná jsem to špatně napsal.
a použity budou jen součástky z list2, ale pokud bude užita skupina z původního listu (návrhu),
musí zůstat zachováno číslování (ta inkrementace).
Toto reprezentuje ten uvedený příklad.

Klidně se ptej dál, pokud to takto není srozumitelné ;-).

var list1Distinct =
	from l in list1
	group l by l.SKUPINA into g
	select new CustomClass { SKUPINA = g.Key, CISLO = g.Max(c => c.CISLO) };

var result =
	from l2 in list2
	from l1 in list1Distinct.Where(l => l.SKUPINA == l2.SKUPINA).DefaultIfEmpty()
	let cislo = l1 == null ? l2.CISLO : l1.CISLO + 1
	select new CustomClass { SKUPINA = l2.SKUPINA, CISLO = cislo };

Zpět do poradny Odpovědět na původní otázku Nahoru