在 C# 中排序列表<KeyValuePair<string, double>>
Sort List<KeyValuePair<string, double>> in c#
我正在开发一个程序,它正在读取 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。
这应该给你一个 Dictionary
其中月份的两个字符串表示是 Key
:
SortValues(input).GroupBy(value => value.Key.Substring(3, 2)).ToDictionary(group => group.Key, group => group.ToArray());
请随意以更优雅的方式解析月份,我认为那部分与您要查找的内容无关。
如果您想使用 LINQ 的延迟加载,可以将 ToArray()
替换为 Select(_ => _)
。两者都只是从 GroupBy
给你的 IGrouping
对象中获取 IEnumerable<KeyValuePair<string,double>>
的一种方法。
您可以使用 Key
的代表月份和年份的子字符串(通过使用 Substring
并在 IndexOf(".")
之后开始)按特定月份对项目进行分组,然后 select 每个组作为一个列表放入另一个列表中,这样你就可以得到一个 List<List<KeyValuePair< string, double>>>
:
List<List<KeyValuePair<string, double>>> result = valueList
.GroupBy(r => r.Key.Substring(r.Key.IndexOf(".") + 1))
.Select(group => group.ToList())
.ToList();
我正在开发一个程序,它正在读取 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。
这应该给你一个 Dictionary
其中月份的两个字符串表示是 Key
:
SortValues(input).GroupBy(value => value.Key.Substring(3, 2)).ToDictionary(group => group.Key, group => group.ToArray());
请随意以更优雅的方式解析月份,我认为那部分与您要查找的内容无关。
如果您想使用 LINQ 的延迟加载,可以将 ToArray()
替换为 Select(_ => _)
。两者都只是从 GroupBy
给你的 IGrouping
对象中获取 IEnumerable<KeyValuePair<string,double>>
的一种方法。
您可以使用 Key
的代表月份和年份的子字符串(通过使用 Substring
并在 IndexOf(".")
之后开始)按特定月份对项目进行分组,然后 select 每个组作为一个列表放入另一个列表中,这样你就可以得到一个 List<List<KeyValuePair< string, double>>>
:
List<List<KeyValuePair<string, double>>> result = valueList
.GroupBy(r => r.Key.Substring(r.Key.IndexOf(".") + 1))
.Select(group => group.ToList())
.ToList();