【问题标题】:Sort values in column and return max repeated items in list对列中的值进行排序并返回列表中的最大重复项
【发布时间】:2017-07-27 16:14:14
【问题描述】:

我的图片如下:

我想做如下两个任务:

  • 第一个:将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
  • 返回书名:Book 2(列表:Book 1、Book 2、Book 2、Book 3)

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

【问题讨论】:

  • @Isaac 我稍微编辑了我的答案,所以你不明白背后的原因。希望可以理解
  • @PavelPájaHalbich:感谢您的建议,但它也无法运行并在以下行显示消息:var ordered = baseList.OrderBy(e => e.Total); --> System.ArgumentNullException: '值不能为空。'
  • 如果您只是简单地复制代码并运行它,那么是的,您会收到该错误。你看到第一行是什么吗?尽管baseList 已初始化,但有一条评论说需要实现从数据源收集数据。在它的当前形式下,你可以编译它,但它不会毫无例外地运行。在这里,人们会指导你正确的方向,但没有人会为你做你的工作。

标签: c# sorting


【解决方案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, [all rows have Name] }。然后,您只需按每个组中的项目数对其进行排序(降序)。最后一步是从该集合中获取第一个项目(如果您在空输入集合上运行它,它可能是空的)并获取它的名称。因为我使用了FirstOrDefault,所以我使用了?. 运算符,当尝试在NULL 对象上使用属性时,它会正确运行。它基本上是一种语法糖。

我建议您拆分此逻辑并遵循渲染(在本例中为表格)逻辑。只需将基础数据保存在某个地方,当您需要更新您的视图表时,运行所需的查询,然后简单地将结果设置到您的表中。尝试将数据设置为数据表,然后再次获取它们并对它们执行一些逻辑 - 这种方法很慢并且没有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 2019-06-15
    • 1970-01-01
    • 2013-08-11
    • 2021-04-19
    • 2011-11-12
    • 1970-01-01
    相关资源
    最近更新 更多