平均列表框中的选择值.C#
本文关键字:选择 列表 | 更新日期: 2023-09-27 18:20:21
在我提出问题之前,让我解释一下我的项目。
我的程序被设计成读取一个.txt文件,并将数据分离到两个不同的列表框中。文本文件的内容如下,标签号后面跟着行程距离(但大约有100行信息):
W980
8.60
F840
9.56
W482
3.50
D487
8.74
F400
4.01
D120
0.90
然后将.txt文件中的数据分解为两个字符串,使得此处的第一行(W980)将出现在名为lstboxTag的列表框中,而第二行(8.60)将出现于名为lsdboxTravel的列表框。
并排比较列表框时,标签和行驶距离将匹配。然而,我需要找到每个标签组(D、F和W)的平均值,并计算每个组的标签数量,同时只使用现在填充的列表框中的信息。
如果不使用数组或列表,这怎么可能呢?
由于我们使用的是不切实际的限制和不多的信息,所以这里有一个不切实际的答案:
textBox1.Text=string.Join("'r'n",Enumerable.Range(0,Math.Min(listBox1.Items.Count,listBox2.Items.Count)).Select(i=>new{tag=listBox1.Items[i].ToString(),value=double.Parse(listBox2.Items[i].ToString())}).GroupBy(row=>row.tag.Substring(0,1),r=>r.value).Select(grp=>string.Format("Group: {0}, Count: {1}, Average: {2}",grp.Key,grp.Count(),grp.Average())).OrderBy(g=>g));
对于你在问题中给出的数据,它给出了以下输出:
Group: D, Count: 2, Average: 4.82
Group: F, Count: 2, Average: 6.785
Group: W, Count: 2, Average: 6.05
至于它是如何工作的。。。
首先,将两个列表框中的值缝合在一起,以提供工作数据集,并进行适当的类型转换。然后,用合适的键(在这种情况下是标记的第一个字符)对要聚合的数据进行分组,并执行所需的聚合:Count和Average。最后将结果转换为可读的内容。
分解后,它看起来像这样:
textBox1.Text =
// this is the outer, final stage that converts the line collection to text
string.Join("'r'n",
// start with a list of numbers, no more than the smallest item count
// (for the supplied data this is [0..5])
Enumerable.Range(0, Math.Min(listBox1.Items.Count, listBox2.Items.Count))
// use those to index the Items collections on your listboxes
.Select(i => new { tag = listBox1.Items[i].ToString(), value = double.Parse(listBox2.Items[i].ToString()) })
// group the values by the tag character
.GroupBy(row => row.tag.Substring(0,1), r => r.value)
// aggregate and produce a line for each group
.Select(grp => string.Format("Group: {0}, Count: {1}, Average: {2}", grp.Key, grp.Count(), grp.Average()))
// sort output - this is optional and probably unnecessary
.OrderBy(r=> r)
);
既然你的老师(或任何人)给你设置了一个愚蠢而不切实际的问题,我就是那种提交愚蠢而不切实际答案的人。您的里程数可能有所不同。不过,我不建议使用评论版本。。。除非你的课程已经非常注重LINQ,这可能只是向你的老师证明你正在网上做作业。
如果这实际上不是家庭作业,告诉你的老板,他坚持将数据存储在列表框中,无论时间多么短暂,不仅效率低下,而且很可能导致处理错误。
我完全期待这个答案会被否决。这是一个糟糕的答案:)