2016-04-18 3 views
0

私は企業とそのデータ(アドレス、電子メール、電話、アクティブなもの(システムでアクティブかどうか))のリストを持っています。名前のリストを簡単に並べ替えることができますが、少し違うものが必要です。リストに重複があり、最初に名前でソートしてから、アクティブまたは非アクティブでソートします。私はその後、それらを削除することができますので、非アクティブな重複をマークしたい。c#.NET LinQ - オブジェクトリストのサブセットの並べ替え

既存のコードは、複数のクラス間であるが、ここでは(Excelのセルがnullの場合、単純に空の文字列を返します)(fixNullValues)JISTです:

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

「完了」の定義を入力してください。すべてのプロパティにnull以外の値がありますか?より多くの「完全」は、「少ない」よりも長い文字列値のプロパティを持っていますか? –

+0

私は、明確にするために質問の言語を更新しました。値がnullにならないようにしました。 –

答えて

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

ありがとうJDupont。コードを正しく理解するために、名前を付けて会社をグループ化し、「アクティブ」が一番上にあることを確認してから、アクティブなアイテムを選択して新しいリストに入れます。いいね? –

+0

これは正しいです。あなたが名前ごとに1つの活発な会社しか持っていないと仮定すると、これはあなたにユニークな活発な会社の列挙可能なリストを手に入れるでしょう。それが役に立てば幸い。申し訳ありませんが、私はそれに説明を追加していない、私は急いでいた。 – 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()); 
    } 
}