Brno? Vypsali jsme pro vás nové termíny školení OOP v Brně!
Avatar
Wayne
Člen
Avatar
Wayne:11. července 19:28

Ahoj, mohl by mě někdo poradit jak lze udělat v LINQu to když se mi nyní vrátí kolekce 2 objektů se stejným Name, tak abych z toho udělal jeden záznam, který však bude obsahovat Parameters jak z prvního záznamu tak i z druhého. Formát je takový to
{
ID:1,
Name : Test,
Parameters
{.
.
.
}},

{
ID:2,
Name : Test,
Parameters
{.
.
.
}},

Předem díky za rady

 
Odpovědět 11. července 19:28
Avatar
Odpovídá na Wayne
Michael Škrášek:11. července 21:59

S LINQ moc neumím, ale podařilo se mi sesmolit tohle:

class Program
{
    static void Main(string[] args)
    {
        List<Data> collection = new List<Data>(new Data[] {
            new Data() {
                name = "test",
                array = new[] { "a", "b" }
            },
            new Data() {
                name = "test",
                array = new[] { "c", "d" }
            },
            new Data() {
                name = "test3",
                array = new[] { "c", "d" }
            }
        });

        List<Data> results = collection.GroupBy(e => e.name).Select(e => new Data() { name = e.Key, array = e.SelectMany(f => f.array).ToArray() }).ToList();
        Console.ReadKey();
    }
}

class Data
{
    public string name;
    public string[] array;
}
Editováno 11. července 22:00
Nahoru Odpovědět  +1 11. července 21:59
I choose a lazy person to do a hard job. Because that person will find an easy way to do it ... Bill Gates
Avatar
tesař.tech
Redaktor
Avatar
tesař.tech:11. července 22:28

Je to zajímavá úloha, pokud někdo přijde s lepším řešením, jsem docela zvědav. Já jsem přišel na toto s GroupBy.

A podle čeho vybereš, který záznam zachováš a který vyhodíš? Já jsem vzal prostě ten první, ostatní se zahodí.

Tvojí noname třídu jsem přejmenoval na Car.

    public class Car
    {
        public int ID { get; set; }
        public List<Parameter> Parameters { get; set; }
        public string Name { get; set; }
    }

    public class Parameter
    {
        public string ParamName { get; set; }
    }

//…

 var grupedListOfCars = listOfCars.GroupBy(x=>x.Name);
var listWithoutSameCars = grupedListOfCars.Select(x =>
            {
                x.First().Parameters = x.SelectMany(c => c.Parameters).ToList();
                return x.First();
           });
 
Nahoru Odpovědět  +1 11. července 22:28
Avatar
tesař.tech
Redaktor
Avatar
Odpovídá na Michael Škrášek
tesař.tech:11. července 22:35

Malá poznámka: Nevýhoda takového řešení je, že v příkazu budeš muset připisovat každou vlastnost (tím, že tam vytváříš nový objekt). Takže když se změní struktura dat (přidá se k nim nějaká vlastnost), musíš měnit i tenhle kus kódu..

 
Nahoru Odpovědět  +2 11. července 22:35
Avatar
Odpovídá na tesař.tech
Michael Škrášek:11. července 22:45

vlastně máme stejné řešení, akorát já vytvářím nový objekt (horší možnost), ty vezmeš ten první a upravíš ho ...

Nahoru Odpovědět 11. července 22:45
I choose a lazy person to do a hard job. Because that person will find an easy way to do it ... Bill Gates
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Wayne
vajkuba1234:11. července 22:55

Klidne pouzij ToLookup extension metodu.
Viz https://docs.microsoft.com/…ble.tolookup?…

Nahoru Odpovědět 11. července 22:55
No hope, no future, JUST WAR! For world peace Israel must be DESTROYED!
Avatar
vajkuba1234
Člen
Avatar
vajkuba1234:12. července 12:59

Blbost, ja spatne cetl zadani...

Nahoru Odpovědět 12. července 12:59
No hope, no future, JUST WAR! For world peace Israel must be DESTROYED!
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.