从列表框中平均选择值。 C#

时间:2015-11-02 23:55:29

标签: c#

在我提出问题之前,让我解释一下我的项目。

我的程序旨在读取.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)的平均值,并计算每组标签的数量,同时仅使用现在填充的列表框中的信息。

不使用数组或列表,这怎么可能?

1 个答案:

答案 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。这是一个糟糕的答案:)