Užsakymas su LINQ

Aš naudoju LINQ į Objektų instrukcijas užsakytame masyve. Kokios operacijos neturėtų būti atliekamos siekiant užtikrinti, kad masyvo tvarka nepasikeistų?

300
15 окт. Matthieu Durut nustatė spalio 15 d 2008-10-15 15:20 '08, 15:20, 2008-10-15 15:20
@ 5 atsakymai

Žiūrėjau į System.Linq.Enumerable metodus, atsisakant bet kokių grąžintų rezultatų, nepriklausomų nuo IE. Aš patikrinau kiekvieno komentarą, siekiant nustatyti, kaip rezultato tvarka skirsis nuo šaltinio eilės.

Išsaugo užsakymą Absoliučiai. Originalų elementą galite suderinti su indeksu su rezultato elementu.

  • AsEnumerable
  • Įmetė
  • Concat
  • Pasirinkite
  • Įjungti
  • Tolist

Išsaugo užsakymą. Elementai filtruojami, bet peradresuojami.

  • Skirtas
  • Išskyrus
  • Susikerta
  • OfType
  • Praleisti
  • Skipwhile
  • Paimkite
  • TakeWhile
  • Kur
  • Pašto kodas (naujas .net 4)

Sunaikina užsakymą - mes nežinome, kokiu būdu tikėtis rezultatų.

  • ToDictionary
  • ToLookup

Neribotai iš naujo apibrėžia užsakymą - naudokite juos pakeisti rezultato tvarką

  • Užsakyti
  • OrderByDescending
  • Atgal
  • TadaBy
  • TadaByDescending

Nepaiso tvarkos pagal kai kurias taisykles.

  • GrupėBy. „IGrouping“ objektai yra išvardyti eilės tvarka pagal elementų, esančių šaltinyje, kuris sukūrė kiekvieno grupės pirmą raktą, tvarką. Grupės elementai pateikiami tokia tvarka, kokia jie yra šaltinyje.
  • GroupJoin - GroupJoin išsaugo išorinių ir kiekvienos išorinės tvarkos elementų, kurie sutampa su vidiniais elementais, elementų tvarką.
  • Prisijungti - išsaugo išorinių elementų tvarką ir kiekvieną iš šių elementų - sutampa vidinio elemento elementus.
  • SelectMany - kiekvienam šaltinio elementui vadinamas selektorius ir grąžinama reikšmių seka.
  • Sąjunga Kai sąraše yra šio metodo grąžinamas objektas, Sąjunga nurodo pirmąją ir antrąją pagal šią tvarką ir pateikia kiekvieną dar nepriimtą elementą.

Redaguoti: perkeliau išskirtinę komandą į išsaugojimą pagal šį įgyvendinimą .

  private static IEnumerable<TSource> DistinctIterator<TSource> (IEnumerable<TSource> source, IEqualityComparer<TSource> comparer) { Set<TSource> set = new Set<TSource>(comparer); foreach (TSource element in source) if (set.Add(element)) yield return element; } 
540
15 окт. Atsakymą pateikė Amy B spalio 15 d. 2008-10-15 16:51 '08 at 4:51 pm 2008-10-15 16:51

Ar tikrai kalbate apie SQL ar masyvus? Kitaip tariant, ar naudojate LINQ į SQL ar LINQ objektams?

LINQ į Objektus faktiškai nepakeičia šaltinio duomenų šaltinio - jie kuria sekas, kurias efektyviai prižiūri duomenų šaltinis. Vienintelės operacijos, pakeičiančios užsakymą, yra OrderBy / OrderByDescending / ThenBy / ThenByDescending - ir net tada jos yra stabilios vienodai užsakytiems elementams. Žinoma, daugelis operacijų filtruos kai kuriuos elementus, tačiau grąžinami daiktai bus ta pačia tvarka.

border=0

Jei konvertuojate į kitą duomenų struktūrą, pvz., „ToLookup“ arba „ToDictionary“, nemanau, kad ši tvarka yra išsaugota šiuo metu - bet tai šiek tiek skiriasi. (Tų pačių raktų verčių rodymo tvarka išsaugoma paieškai, nors manau.)

29
15 окт. Jon Skeet atsakymas, pateiktas spalio 15 d 2008-10-15 15:24 '08, 15:24, 2008-10-15 15:24

Jei dirbate su masyvu, atrodo, kad naudojate LINQ-to-Objects, o ne SQL; Ar galite patvirtinti? Dauguma LINQ operacijų nieko nekeičia (išėjimas bus ta pačia tvarka kaip ir įvestis), todėl nenaudokite kito rodinio (OrderBy [Descending] / ThenBy [Descending]).

[redaguoti: kaip Jonas pasakė aiškiau; LINQ paprastai sukuria naują seką, paliekant tik originalius duomenis]

Atkreipkite dėmesį, kad spustelėję duomenis žodynuose Dictionary<,> (ToDictionary) bus suklijuojami duomenys, nes žodynas neatitinka jokios konkrečios rūšiavimo tvarkos.

Tačiau dažniausiai pasitaikantys dalykai (Pasirinkti, Kur, Praleisti, Paimti) turi būti tvarkingi.

6
15 окт. Marc Gravell atsakymas, spalio 15 d. 2008-10-15 15:25 '08, 15:25, 2008-10-15 15:25

Panašaus klausimo, kuriame kalbama apie oficialius dokumentus, atsakymas buvo puikus. Norėdami cituoti:

Enumerable metodai (LINQ į objektus, taikomus List<T> ), galite pasikliauti elementų, kuriuos GroupBy Select , „ Where arba „ GroupBy . Tai netaikoma daiktams, kurie iš esmės yra netvarkingi, pvz., „ ToDictionary ar „ Distinct .

Enumerable.GroupBy dokumentacijos :

IGrouping<TKey, TElement> yra išvardyti eilės tvarka, remiantis šaltinio eilės tvarka, kuri sukūrė kiekvieno IGrouping<TKey, TElement> pirmąjį raktą. Grupės elementai gaunami tokia tvarka, kokia jie yra source .

Tai nebūtinai tinka IQueryable išplėtimo IQueryable (kitiems LINQ teikėjams).

Šaltinis: LINQ kintamieji metodai palaiko santykinio elemento tvarką?

3
12 июня '14 в 0:04 2014-06-12 00:04 atsakymą įteikė Curtis Yallop birželio 14 d. 14 val. 0:04 2014-06-12 00:04

Bet kuri „grupė“ arba „užsakymas“ gali pakeisti užsakymą.

2
15 окт. atsakymas duotas leppie 15 oct. 2008-10-15 15:53 '08, 15:53, 2008-10-15 15:53

Kiti klausimai apie etikečių arba Užduoti klausimą