我的照片如下:
我想做两个任务,如下:
第一个:将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):
请帮忙为我提供建议。 非常感谢你。
答案 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
对象上使用属性时,它将正常运行。它基本上是一种语法糖。
我建议你拆分这个逻辑并跟踪渲染(在本例中为表格)逻辑。只需保留一些基础数据,当您需要更新您的视图表时,运行所需的查询,然后只需将结果设置为您的表。试图将数据设置为数据表,然后再次获取它们并对它们做一些逻辑 - 这种方法很慢并且不会有任何好处。