2017-07-27 5 views
1

内の項目を繰り返して、私は次のように絵を持っている:ソート列の値と最大値を返すには、リスト

enter image description here

私は怒鳴るなどの2つのタスクやりたい:

  • 最初のものを:合計TOTAL列の値を最小値から最大値にソートする

  • 2番目の値:レコードを選択して(例:4レコード)、mリスト内で繰り返されるaxアイテム

ここで私のコードは動作しません。

private void Form1_Load(object sender, EventArgs e) 
    { 
     customersBindingSource.DataSource = new List<Customers>();   

    }    
    private void btnGet_Click(object sender, EventArgs e) 
    {    
     int k; 
     string temp;    
     //Step 1: Sort values smallest to largest on TOTAL column 
     DataTable dt = new DataTable(); 
     DataView dv = new DataView(); 
     dv = dt.DefaultView; 
     dv.Sort = dv.Table.Columns[3].ColumnName + "ASC"; 
     dt = dv.Table; 
     //Step 2: Input k rows & return max repeated items in list of Column 1 (BOOK_NAME) 
     k = Convert.ToInt32(txtkvalue.Text); 
     for (int i = 0; i < k; i++) 
     { 
      temp = dataGridView.Rows[i].Cells[1].Value.ToString(); 
      List<string> prod = new List<string>(); 
      prod.Add(temp); 
      var grouped = prod.ToLookup(x => x); 
      var maxRepetitions = grouped.Max(x => x.Count()); 
      var maxRepeatedItems = grouped.Where(x => x.Count() == maxRepetitions) 
              .Select(x => x.Key).ToList(); 
      //MessageBox.Show(maxRepeatedItems.ToString()); 
     }    
    } 

期待結果(K = 4):

  • ソート(TOTALカラム):150、200、200、250、300
  • 戻り予約名:ブック2(リスト:予約1、Book 2、Book 2、Book 3)

私に助言してください。 ありがとうございます。

+0

@イサク私は私の答えをちょっと編集しました。期待しています。 –

+0

@ PavelPhjaHalbich:助けてくれてありがとうございますが、実行してメッセージを表示することはできません:var ordered = baseList.OrderBy(e => e.Total); - > System.ArgumentNullException: '値はnullにはできません。' – Issac

+0

コードをコピーして実行するだけの場合は、そのエラーが発生します。最初の行に何が表示されていますか? 'baseList'は初期化されていますが、あなたのデータソースからデータを収集する必要があるというコメントがあります。現在のフォームではコンパイルできますが、例外なく実行されるわけではありません。ここでSO人は方向を修正するようにあなたを導くでしょうが、誰もあなたのためにあなたの仕事をしません。 –

答えて

1

あなたはこのような値を維持するためのデータ構造を持っているだろうと仮定すると:

class Customers 
{ 
    public int ID {get; set; } 
    public string Name {get; set; } 
    public double Price {get; set; } 
    public double Total {get; set; } 
} 

次にあなたがクエリを探している:

List<Customers> baseList = null;// TODO get data 

// order by Total 
var ordered = baseList.OrderBy(e => e.Total); 

// get first n rows: 
var nRows = baseList.Take(n); 

// get name of the most repeated element 
var max = nRows.GroupBy(e => e.Name).OrderByDescending(e => e.Count()).FirstOrDefault()?.Key; 

第三クエリで何が起こっているのかを説明するには:あなたはコレクションを取って名前でグループ化してください。 Grupped構造は{Name、[名前を持つすべての行]}になります。次に、あなたはそれを各grupの項目数で注文します(降順)。最後のステップは、そのコレクションから最初のアイテムを取得することです(空の入力コレクションでそれを実行する場合は空でもかまいません)。 FirstOrDefaultを使用していたので、NULLオブジェクトでプロパティを使用しようとすると正しく動作する?.演算子を使用しました。それは基本的に構文的な砂糖です。

このロジックを分割し、レンダリング(この場合はテーブルに)することをお勧めします。ベースデータをどこかに保存して、yorビューテーブルを更新する必要があるときは、必要なクエリを実行して、単にテーブルに結果を設定します。データをdatatableに設定しようとしてからもう一度それらを取得し、それらのロジックを実行してください。このアプローチは遅く、うまくいかないでしょう。

関連する問題