2016-04-18 31 views
0

我有一個公司及其數據的列表(地址,電子郵件,電話,活動?(無論它們是否在我們的系統中活動))。我可以輕鬆地對名稱進行排序,但我需要一些與衆不同的東西。該列表有重複,我想先按名稱排序,然後按活動或非活動排序。然後,我想標記不活動的重複項,以便我可以刪除它們。c#.NET LinQ - 排序對象列表的子集

現有的代碼是在多個類別,但這裏是JIST(fixNullValues()如果Excel單元格爲空只是簡單地返回一個空字符串):

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

請提供「完整」的定義?所有屬性都有非空值?更「完整」具有比「更少」完整的字符串值更長的屬性? –

+0

爲了清楚起見,我更新了問題的語言。我確保沒有任何值會爲空。 –

回答

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

謝謝JDupont。爲了確保我能夠正確理解代碼,請按名稱對公司進行分組,然後確保「有效」位於頂部,然後選擇該有效項目並將其放入新列表中。聽起來對嗎? –

+0

這是正確的。假設你每個名字只有一個活躍的公司,這會給你一個獨特的活躍公司名單。希望能幫助到你。對不起,我沒有添加說明,我很着急。 – JDupont

0
下面

見代碼:

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()); 
    } 
}