平均列表框中的选择值.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)的平均值,并计算每个组的标签数量,同时只使用现在填充的列表框中的信息。

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

平均列表框中的选择值.C#

由于我们使用的是不切实际的限制和不多的信息,所以这里有一个不切实际的答案:

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,这可能只是向你的老师证明你正在网上做作业。

如果这实际上不是家庭作业,告诉你的老板,他坚持将数据存储在列表框中,无论时间多么短暂,不仅效率低下,而且很可能导致处理错误。

我完全期待这个答案会被否决。这是一个糟糕的答案:)