2016-04-18 18 views
0

Ich habe eine Liste von Firmen und ihre Daten (Adresse, E-Mail, Telefon, aktiv? (Ob sie in unserem System aktiv sind)). Ich kann die Liste leicht nach dem Namen sortieren, aber ich brauche etwas anderes. Die Liste hat Duplikate und ich möchte zuerst nach dem Namen sortieren, dann nach aktiv oder inaktiv. Ich möchte dann die Duplikate markieren, die inaktiv sind, damit ich sie löschen kann.C# .NET LinQ - Sortierung Teilmengen einer Liste von Objekten

Der vorhandene Code ist über mehrere Klassen, aber hier ist der jist (fixNullValues ​​() einfach einen leeren String zurück, wenn die Excel-Zelle null ist):

for (int i = 2; i <= xlRange.Rows.Count; i++) 
{ 
      firm = new Firm(); 
      string begCell; 
      begCell = "B" + i; 
      excelCell = (Microsoft.Office.Interop.Excel.Range)excelWorksheet.get_Range(begCell, begCell); 
      firm.acctNo = fixNullValues(Convert.ToString(excelCell.Value2)); 

      begCell = "C" + i; 
      excelCell = (Microsoft.Office.Interop.Excel.Range)excelWorksheet.get_Range(begCell, begCell); 
      firm.name = fixNullValues(Convert.ToString(excelCell.Value2)); 

      begCell = "D" + i; 
      excelCell = (Microsoft.Office.Interop.Excel.Range)excelWorksheet.get_Range(begCell, begCell); 
      firm.addy1 = fixNullValues(Convert.ToString(excelCell.Value2)); 

      begCell = "E" + i; 
      excelCell = (Microsoft.Office.Interop.Excel.Range)excelWorksheet.get_Range(begCell, begCell); 
      firm.city = fixNullValues(Convert.ToString(excelCell.Value2)); 

      begCell = "AB" + i; 
      excelCell = (Microsoft.Office.Interop.Excel.Range)excelWorksheet.get_Range(begCell, begCell); 
      if (Convert.ToString(excelCell.Value2).Equals("Active", StringComparison.OrdinalIgnoreCase)) 
       firm.active = true; 

      firmList.Add(firm); 
+0

Bitte geben Sie die Definition von "vollständig"? Alle Eigenschaften haben Nicht-Null-Werte? Mehr "vollständig" hat Eigenschaften längerer String-Werte als "weniger" abgeschlossen? –

+0

Ich habe die Sprache zur Klärung der Frage aktualisiert. Ich habe sichergestellt, dass keine Werte null sind. –

Antwort

0
var yourNewListWithoutDeleting = firmList.GroupBy(x => x.name) 
             .SelectMany(x => 
              x.OrderByDescending(y => y.active) 
              .Take(1) 
             ); 
+0

Danke JDupont. Um sicherzustellen, dass ich den Code richtig verstehe, gruppiert er die Firmen nach Namen und stellt dann sicher, dass "Aktiv" ganz oben steht und wählt dann das Aktive Element aus und fügt es in eine neue Liste ein. Ton richtig? –

+0

Das ist richtig. Angenommen, Sie haben nur eine aktive Firma pro Name, erhalten Sie eine aufzählbare Liste von einzigartigen aktiven Firmen. Ich hoffe es hilft. Tut mir leid, ich habe keine Beschreibung hinzugefügt, ich hatte es eilig. – JDupont

0

Siehe Code unten:

class Firm : IComparable<Firm>, IComparable 
{ 
    string acctNo; 
    string name; 
    string addy1; 
    string city; 
    bool active; 

    int completeness 
    { 
     get 
     { 
      return accNo.Length + name.Length + addy1.Length + city.Length; 
     } 
    } 

    public int CompareTo(Firm other) 
    { 
     var c = name.CompareTo(other.name); 
     if (c != 0) 
      return c; 
     c = active.CompareTo(other.active); 
     if (c != 0) 
      return c; 
     return completeness.CompareTo(other.completeness); 
    } 

    public int CompareTo(object other) 
    { 
     return CompareTo((Firm)other); 
    } 

    public static IEnumerable<Firm> sortFirms(IEnumerable<Firm> firms) 
    { 
     return firms.GroupBy(f => f.name).Select(g => g.OrderByDescending().First()); 
    } 
} 
Verwandte Themen