对列中的值进行排序并返回列表中的最大重复项

时间:2017-07-27 16:14:15

标签: c# sorting

我的照片如下:

enter image description here

我想做两个任务,如下:

  • 第一个:将TOTAL列中的值从最小值排序到最大值

  • 第二个:输入需要选择的数字记录(例如:4条记录)并返回列表中重复的最大项目

这是我的代码,但它不起作用。

    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册,第2册,第2册,第3册)

请帮忙为我提供建议。 非常感谢你。

1 个答案:

答案 0 :(得分: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对象上使用属性时,它将正常运行。它基本上是一种语法糖。

我建议你拆分这个逻辑并跟踪渲染(在本例中为表格)逻辑。只需保留一些基础数据,当您需要更新您的视图表时,运行所需的查询,然后只需将结果设置为您的表。试图将数据设置为数据表,然后再次获取它们并对它们做一些逻辑 - 这种方法很慢并且不会有任何好处。