2017-07-27 57 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对象的属性时,运算符的行为将会正确。它基本上是一个语法糖。

我建议你分开这个逻辑,然后渲染(在这种情况下是表格)逻辑。只需保留某个基本数据,并在需要更新查看表时,运行所需的查询,然后将结果简单地设置到您的表中。试图将数据设置为数据表,然后再次获取它们并对它们执行一些逻辑 - 这种方法很慢并且不会有好处。