2017-07-27 87 views
1

返回最多重複的項目我的圖片如下:排序值,並在列表

enter image description here

我願做兩個工作波紋管:

  • 第一種:將TOTAL列中的值從最小到最大排序

  • 第二個:輸入需要選擇的記錄數(例如:4條記錄)並返回m它在列表中重複的斧頭項目

在這裏我的代碼,但它是行不通的。

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

@Isaac我編輯了我的答案一點點,所以你打開背後的東西。希望這是可以理解的 –

+0

@PavelPájaHalbich:感謝您的建議,但它也無法運行並顯示消息:var ordered = baseList.OrderBy(e => e.Total); - > System.ArgumentNullException:'值不能爲空。' – Issac

+0

如果你只是簡單地複製代碼並運行它,那麼是的,你會得到那個錯誤。你看到第一行是什麼嗎?雖然'baseList'被初始化,但有一條評論說你*需要實現從你的數據源收集數據。在目前的形式中,你可以編譯它,但它不會毫無例外地運行。在這裏,人們會引導你正確的方向,但沒有人會爲你做你的工作。 –

回答

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結構將是{名稱,[所有行都有名稱]}。然後你只需按照每個grup中的物品數量(降序)來訂購它。最後一步是從該集合中獲取第一個項目(如果您在空輸入集合上運行它,則可能爲空)並獲取它的名稱。由於我使用FirstOrDefault,因此我使用?.運算符,當嘗試使用NULL對象的屬性時,運算符的行爲將會正確。它基本上是一個語法糖。

我建議你分開這個邏輯,然後渲染(在這種情況下是表格)邏輯。只需保留某個基本數據,並在需要更新查看錶時,運行所需的查詢,然後將結果簡單地設置到您的表中。試圖將數據設置爲數據表,然後再次獲取它們並對它們執行一些邏輯 - 這種方法很慢並且不會有好處。