2012-06-05 29 views
4

我需要在dataGridView中计数并呈现不同值/唯一值。 我想这样呈现,而且这个代码在列表中工作得很好。使用.NET中的linq计算dataGridView中列的不同值

 List<string> aryIDs = new List<string>(); 
     aryIDs.Add("1234"); 
     aryIDs.Add("4321"); 
     aryIDs.Add("3214"); 
     aryIDs.Add("1234"); 
     aryIDs.Add("4321"); 
     aryIDs.Add("1234"); 

     var result= aryIDs.GroupBy(id => id).OrderByDescending(id => id.Count()).Select(g => new { Id = g.Key, Count = g.Count() }); 

但是,当我尝试的dataGridView使用相同的方法在专栏中,我得到一个错误,指出GROUPBY不能在我的dataGridView使用。

 DataGridView dataGridView1= new DataGridView(); 
     dataGridView1.Columns.Add("nr", "nr"); 
     string[] row1 = new string[] { "1234" }; 
     string[] row2 = new string[] { "4321" }; 
     string[] row3 = new string[] { "3214" }; 
     string[] row4 = new string[] { "1234" }; 
     string[] row5 = new string[] { "4321" }; 
     string[] row6 = new string[] { "1234" }; 

     object[] rows = new object[] { row1, row2, row3, row4, row5, row6 }; 

     foreach (string[] rowArray in rows) 
     { 
      dataGridView1.Rows.Add(rowArray); 
     } 

     var result = dataGridView1.GroupBy(id => id).OrderByDescending(id => id.Count()).Select(g => new { Id = g.Key, Count = g.Count() }); 

所以我的问题是,我该如何适应这个linq语法来处理dataGridView中的列?如果可能的话,我根本不想使用列表。

回答

12

这会为你的工作,例如:

var result = dataGridView1.Rows.Cast<DataGridViewRow>() 
    .Where(r => r.Cells[0].Value != null) 
    .Select (r => r.Cells[0].Value) 
    .GroupBy(id => id) 
     .OrderByDescending(id => id.Count()) 
     .Select(g => new { Id = g.Key, Count = g.Count() }); 
3

我认为这样做,但我不是100%确定。试试吧,如果你有任何问题,让我知道...

var distinctRows = (from GridViewRow row in dataGridView1.Rows 
        select row.Cells[0] 
        ).Distinct().Count(); 
+0

它会计算所有不同的值,但不是每个的计数这是OP在列表示例中做的不同值 –

+1

这对我有帮助,但它应该来自'DataGridViewRow'和'row.Cells [0] .Value' – StevenWhite

相关问题