C# Array.Sort (med null) ** löst **

Permalänk

C# Array.Sort (med null) ** löst **

Hejsan, jag är ganska ny på C# och objektorienterad programmering. Behöver sortera en array med objektet person, närmare specifikt person.Namn. Detta funkar med koden nedan men i listan finns platser som är tomma med värdet null. Hur kan jag göra denna sorteringen utan att den flippar ut helt om den stöter på null värden? Helst skulle jag vilja putta bak alla dessa till slutet av den sorterade array:n

EDIT: Har varit otydligt, så förtydligar. Alla tomma platser är just tomma platser som i en större enhet, tänk buss, tåg etc i rusningstid kontra sista nattkörningen. Platser med null värden måste vara med och kan man sortera dem vore de bra om de puttas bakåt.

Array.Sort(person, (x, y) => x.Namn.CompareTo(y.Namn));

Tack på förhand

förtydligande ang null
Visa signatur

AMD Ryzen 5 2600 | MSI B450 Gaming Pro Carbon AC | Corsair 32GB CL 15 (4x8GB) DDR4 3000MHz | Corsair RM750X 750W v2 | MSI RTX 2060 Ventus XS 6GB | NZXT H440 Midi Tower :: ASUS VivoBook 15 X505ZA-BQ252T AMD Ryzen 7 | 2700U Radeon Vega 10
Vilken var din första?

Permalänk
Avstängd

Det enklaste att testa är att använda frågetecken som: x.Namn?... Om namn kan vara null.

Permalänk
Medlem

Inte riktigt svar på din fråga men:
Måste du behålla nulls i arrayen? Jag hade kastat bort dem så fort som möjligt istället för att behöva koda runt det hela tiden (och sen bytt till List<Person> om det behövs).

Nitpick:
- Listan heter person i singular nu, persons är bättre (eller personer vid svenska)

Visa signatur

g++

Permalänk
Medlem
Skrivet av yestomtom:

Hejsan, jag är ganska ny på C# och objektorienterad programmering. Behöver sortera en array med objektet person, närmare specifikt person.Namn. Detta funkar med koden nedan men i listan finns platser som är tomma med värdet null. Hur kan jag göra denna sorteringen utan att den flippar ut helt om den stöter på null värden? Helst skulle jag vilja putta bak alla dessa till slutet av den sorterade array:n

Array.Sort(person, (x, y) => x.Namn.CompareTo(y.Namn));

Tack på förhand

Precis som @snajk skriver ovan, använd frågetecknet för att enkelt hoppa över nullvärden.

Array.Sort(person, (x, y) => x.Namn?.CompareTo(y.Namn));

Eller om det är själva personen som kan vara null:

Array.Sort(person, (x, y) => x?.Namn.CompareTo(y.Namn));

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB

Permalänk
Medlem
Skrivet av Pamudas:

Precis som @snajk skriver ovan, använd frågetecknet för att enkelt hoppa över nullvärden.

Array.Sort(person, (x, y) => x.Namn?.CompareTo(y.Namn));

Eller om det är själva personen som kan vara null:

Array.Sort(person, (x, y) => x?.Namn.CompareTo(y.Namn));

Ser ut som det kommer krascha när y är null. Jag instämmer med tidigare talare: Varför ens behålla en massa nulls i en samling som ska sorteras?

Och #2: Även `x.Name?` kommer väl ge fel eftersom IComparer måste returnera en int men kommer returnera null där..

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

Om null-värdena ligger samlade i början eller slutet av arrayen så kan man även använda Array.Sort(Array array, int index, int length)-varianten av Sort.

Permalänk

Tack för hjälpen, det fick mig att se problemet från en lite annan vinkel med hjälp av ?
Hittade följande lösning https://stackoverflow.com/questions/35097154/null-is-sorted-f...

Array.Sort(arr, (a, b) => a == null ? 1 : b == null ? -1 : a.CompareTo(b));

Visa signatur

AMD Ryzen 5 2600 | MSI B450 Gaming Pro Carbon AC | Corsair 32GB CL 15 (4x8GB) DDR4 3000MHz | Corsair RM750X 750W v2 | MSI RTX 2060 Ventus XS 6GB | NZXT H440 Midi Tower :: ASUS VivoBook 15 X505ZA-BQ252T AMD Ryzen 7 | 2700U Radeon Vega 10
Vilken var din första?

Permalänk
Hedersmedlem
Skrivet av yestomtom:

Tack för hjälpen, det fick mig att se problemet från en lite annan vinkel med hjälp av ?
Hittade följande lösning https://stackoverflow.com/questions/35097154/null-is-sorted-f...

Array.Sort(arr, (a, b) => a == null ? 1 : b == null ? -1 : a.CompareTo(b));

Du bör fundera på om det verkligen är rimligt att ha null-värden i listan annars. Det kan vara ett tecken på en dålig implementering.

Permalänk
Medlem

Ser att du redan löst det på ett annat sätt, men kan ändå droppa detta alternativ.

// med LINQ arr.OrderByDescending(p => p?.Name);

Om du nu ska skriva objektorienterat så hade jag i min bussklass gjort en lista med säten, där varje säte är en klass som i sin tur kan hålla i en person (föredra ett ID) och eventuellt en bool för taget/ledigt.
Sen generellt om du behöver ändra på data i din IEnumerable, använd inte en array, använd en List.