在我提出问题之前,让我解释一下我的项目。
我的程序旨在读取.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)将出现在名为lstboxTravel的列表框中。
并排比较列表框时,标签和行程距离将匹配。但是,我需要找到每个标签组(D,F和W)的平均值,并计算每组标签的数量,同时仅使用现在填充的列表框中的信息。
不使用数组或列表,这怎么可能?
答案 0 :(得分:0)
由于我们正在处理不切实际的限制而没有太多信息,这是一个不切实际的答案:
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
至于如何运作......
首先,您将两个列表框中的值拼接在一起,为您提供工作数据集,并进行适当的类型转换。然后,通过合适的密钥(在这种情况下为标记的第一个字符)对要聚合的数据进行分组,并执行所需的聚合:计数和平均。最后将结果转换为可读的内容。
分解它看起来像这样:
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,它可能只是向老师证明你在网上做作业。
如果这实际上不是家庭作业,请告诉你的老板他坚持将数据存储在列表框中,无论多么短暂,不仅效率低下而且很愚蠢,但也可能导致处理错误。
我完全期待这个答案的downvotes。这是一个糟糕的答案:)