2012-04-06 2 views
1

Ich habe eine Liste von "ClientContacts" --- die entweder einen Nachnamen (im Falle eines Menschen) oder einen EntityName (im Falle eines Kontakts für allgemeine Verwendung, wie techsupport @) haben. mycompany.com).Sortieren einer Liste nach zwei Variablen

Was ich tun möchte, ist diese Liste alphabetisch nach LastName, und in dem Fall, wo keine LastName existiert (mit anderen Worten, ein EntityName existiert), diesen EntityName als LastName zu behandeln, und die Sortierung als ob es fortsetzen waren ein Nachname.

Damit die gewünschte Ergebnis wie folgt aussieht:

  1. Bond James
  2. Customer Support
  3. Tore Bill
  4. Tech Support
  5. Williams Robin

Dies führt zu einem Absturz, da einige ClientContacts, die keinen LastName haben, auftauchen.

clientContactList.Sort(
    delegate(ClientContact c1, ClientContact c2) 
     { return c1.LastName.CompareTo(c2.LastName); }); 

und die folgenden erlaubt es mir, ohne abzustürzen, um durchzukommen, und es sortiert sie durch ClientContact EntityName erste und dann LastNames:

  list.Sort(delegate(ClientContact c1, ClientContact c2) { 
      try 
      { 
       return c1.LastName.CompareTo(c2.LastName); 
      } 
      catch 
      { 
       try 
       { 
        return c1.EntityName.CompareTo(c2.LastName); 
       } 
       catch 
       { 
        return c1.EntityName.CompareTo(c2.EntityName); 
       } 

      } 
     }); 

ergibt:

  1. Customer Support
  2. Technische Unterstützung
  3. Bond James
  4. Tore Bill
  5. Williams Robin

Wie kann ich meine Liste, wie das oben gewünschte Ergebnis sehen sortiert?

+1

Wenn Sie sagen, "nicht", meinst du, der Wert ist null? Oder ist eine leere Zeichenfolge auch möglich? –

Antwort

6

Versuchen Sie diesen Vergleich anstelle:

(c1.LastName ?? c1.EntityName).CompareTo(c2.LastName ?? c2.EntityName) 
+0

Hooray für Null Koaleszenzoperatoren :) –

+0

Erstaunlich. Vielen Dank. – CptSupermrkt

0

Sie dies tun könnte:

list.Sort(delegate(ClientContact c1, ClientContact c2) 
{ 
    return !string.IsNullOrEmpty(c1.LastName) ? 
     c1.LastName.CompareTo(c2.LastName) : 
     c1.EntityName.CompareTo(c2.LastName);   
}); 
2

Wenn Sie LINQ verwenden, können Sie es wie folgt tun:

var sortedList = list.OrderBy(x => x.LastName ?? x.EntityName); 
+0

SortedList ist ein schlechter Name, es ist keine Liste, es ist IEnumerable

+0

Oh, Carl. Entspanne dich mit deinem schlechten Selbst. Ich sehe deinen Punkt, aber "aufzählbar" ist genau so ein Bissen. Betrachten Sie es als "Liste" in einem Verlierer, natürlicheren Sinn verwenden. Ich würde keine Eigenschaft oder Methode so benennen, sondern eine automatische lokale Variable ... lockere auf. –