【问题标题】:Sort List<KeyValuePair<string, double>> in c#C#中的排序列表<KeyValuePair<string, double>>
【发布时间】:2019-09-19 12:29:58
【问题描述】:

我正在开发一个程序,它正在读取 csv 文件并将它们的值排序到 KeyValuePair-List 中。

private List<KeyValuePair<string, double>> SortValues(string[,] csvData)
    {
        var dateList = new List<String>();
        var valuesList = new List<double>();

        List<KeyValuePair<string, double>> valueList = new List<KeyValuePair<string, double>>();

        for (int i = 1; i < csvData.GetLength(0) - 1; i++)
        {
            String date = csvData[i, 1];
            String values = csvData[i, 14];

            date = date.Remove(0, 1);
            date = date.Remove(date.Length - 1, 1);

            values = values.Remove(0, 1);
            values = values.Remove(values.Length - 1, 1);

            dateList.Add(date);
            valuesList.Add(Double.Parse(values));

            valueList.Add(new KeyValuePair<string, Double>(date, Double.Parse(values)));

        }

        var result = valueList
            .GroupBy(r => r.Key)
            .Select(r => new KeyValuePair<string, double>(r.Key, r.Sum(p => p.Value)))
            .ToList();

        return result;
    }

我的结果是一大串日期为字符串,货币值为双精度值,如下所示:

{[29.03.19, EUR]}{[28.03.19, EUR]}{[27.03.19, EUR]}{[26.03.19, EUR]}{[25.03.19, EUR]}{[19.03.19, EUR]}{[18.03.19, EUR]}{[14.03.19, EUR]}{[12.03.19, EUR]}{[11.03.19, EUR]}{[08.03.19, EUR]}{[07.03.19, EUR]}{[06.03.19, EUR]}{[05.03.19, EUR]}{[04.03.19, EUR]}{[01.03.19, EUR]}{[28.02.19, EUR]}{[27.02.19, EUR]}{[26.02.19, EUR]}{[19.02.19, EUR]}{[12.02.19, EUR]}{[11.02.19, EUR]}{[07.02.19, EUR]}{[05.02.19, EUR]}{[04.02.19, EUR]}{[01.02.19, EUR]}

我的问题是将这些 KeyValuePair-List 拆分为每个月的单独列表。

例如:我想只提取第二个月的所有“KeyValuePairs”并将它们写入单独的 KeyValuePair-List。

【问题讨论】:

  • 我建议使用值元组而不是KeyValuePair
  • 我需要“KeyValuePair-List”,因为这是我需要的格式,将其放入图表中
  • @Dai 你能详细介绍一下额外的学习曲线将如何简化 OP 的问题吗?
  • .GroupBy(r =&gt; r.Key.Substring(r.Key.IndexOf(".") + 1)) 将由第一个'.' 字符之后的Key 形成的字符串分组,我相信它是Month.Year
  • 我得到 {[03.19, EUR]} {[02.19, EUR]} 我不想对月份值求和,我需要将每个月的每个值放在一个单独的列表中,知道吗? :)

标签: c# sorting keyvaluepair


【解决方案1】:

这应该给你一个Dictionary,其中月份的两个字符串表示是Key

SortValues(input).GroupBy(value => value.Key.Substring(3, 2)).ToDictionary(group => group.Key, group => group.ToArray());

请随意以更优雅的方式解析月份,我认为这部分与您要查找的内容无关。

如果您想利用 LINQ 的延迟加载,可以将 ToArray() 替换为 Select(_ =&gt; _)。两者都只是从GroupBy 提供给您的IGrouping 对象中获取IEnumerable&lt;KeyValuePair&lt;string,double&gt;&gt; 的一种方式。

【讨论】:

  • 这就是我要找的东西,非常感谢!
【解决方案2】:

您可以使用代表月份和年份的Key 的子字符串(使用Substring 并在IndexOf(".") 之后开始)按特定月份对项目进行分组,然后选择每个组作为列表进入另一个列表,这样你最终得到一个List&lt;List&lt;KeyValuePair&lt; string, double&gt;&gt;&gt;

List<List<KeyValuePair<string, double>>> result = valueList
    .GroupBy(r => r.Key.Substring(r.Key.IndexOf(".") + 1))
    .Select(group => group.ToList())
    .ToList();

【讨论】:

    猜你喜欢
    • 2013-01-10
    • 1970-01-01
    • 2021-02-21
    • 2014-07-03
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 2011-11-22
    • 2020-01-13
    相关资源
    最近更新 更多