LINQ, anonymní typ a Distinct   zodpovězená otázka

VB.NET

Mějme následující příklad (naplnění pole daty pro zjednodušení neřeším):

Structure Person
  Name As String
  Surname As String
  Id As Integer
End Structure
Dim persons(9) As Person
Dim selection = From p In persons _
                Select p.Name, p.Surname, p.Id Distinct

Tento dotaz vybere všechny p, které mají unikátní zároveň Name, Surname i Id. Já bych potřeboval vytvořit IEnumerable anonymního typu obsahujícího pouze Name a Surname (Select p.Name, p.Surname), ale unikátního pouze podle Id (Select p.Id Distinct). Lze to vůbec v jediném LINQ dotazu?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pokud chcete použít metodu Distinct, tak to nepůjde. Protože musíte vytvořit comparer a z anonymního typu jej nevytvoříte. Tedy možná to půjde nějak obelhat, ale nesázel bych na to. Možná by to šlo generickou funkcí s tím, že kompilátor odhadne typ podle typu požadované návratové hodnoty, jako to dělá v LINQ.

Lépe to uděláte groupováním podle Id a pak výběrem First položky z každé skupiny. Takže to v jenom příkazu jde.

nahlásit spamnahlásit spam 3 / 3 odpovědětodpovědět

Dobrá rada nad zlato. Kdyby to někdo potřeboval, tak řešení je:

Dim selection = From p In persons _
                Group p.Name, p.Surname _
                By p.Id Into Persons = Group

Výsledek v selection bude IEnumerable, kde počet záznamů bude počet unikátních Id a každý záznam bude obsahovat vlastnost Id a Persons, což je právě požadované IEnumerable anonymního typu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback