我有一个列表,其中包含一些字符串,如下所示:
List<String> l = new List<String>(){
"item1 1",
"item2 2",
"item3 3",
"item1 4",
"item1 5",
"item3 6"};
我想总结一下相同的项目。例如:
l = {"item1 10", "item2 2", "item3 9"}
我试过这个:
List<String> result = new List<String>();
for (int i = 0; i < total.Count; i++)
{
for (int j = 0; j < i; j++)
{
int diferenta = 0;
if (total[i].Substring(0, total[i].IndexOf(" ")).Equals(total[j].Substring(0, total[j].IndexOf(" "))))
{
diferenta = int.Parse(ExtractNumber(total[i].Substring(total[i].IndexOf(" ")))) + int.Parse(ExtractNumber(total[j].Substring(total[j].IndexOf(" "))));
total[i] = total[i].Replace(ExtractNumber(total[i].Substring(total[i].IndexOf(" "))), diferenta.ToString());
result.Add(total[i]);
}
}
获得不同的元素:
List<String> final = result.Distinct().toList();
我的方式根本不正确所以我想请你帮忙。
答案 0 :(得分:3)
您可以拆分每个元素,按第一个组件分组,然后将第二个组件加起来:
var groupQuery = l.Select(x => x.Split(new[] { ' ' })).GroupBy(x => x[0]);
var sumQuery = groupQuery.Select(x => new { x.Key, Total = x.Select(elem => int.Parse(elem[1])).Sum() });
foreach (var total in sumQuery)
{
Console.WriteLine("{0}: {1}", total.Key, total.Total);
}
这段代码显然省略了一堆错误检查(如果字符串没有拆分,或者没有可以解析的第二个组件会发生什么?),但可以毫不费力地添加它。 / p>
答案 1 :(得分:1)
不处理坏数据(例如没有处理白色空间等)。
int sumTotal = (from i in l
let parts = i.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
let id = parts[0]
let count = int.Parse(parts[1])
group count by id into Numbers
where Numbers.Count() != 1
select Numbers.Sum()).Sum();
修改:即使没有重复,也没有看到您想要计算每个项目。这更容易,您只需要从查询中删除where CountGroup.Count() != 1
:)
所以完整的LINQ查询包括处理错误格式的数据:
int number=0;
int sum = (from i in l
let parts = i.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
where parts.Length==2
let id = parts[0]
let isInt = int.TryParse(parts[1], out number)
where isInt
group number by id into Numbers
select Numbers.Sum()).Sum();
答案 2 :(得分:1)
List<string> outputList =
inputList.GroupBy(s => s.Split(' ')[0])
.Select(g.Key + " " + g.Sum(s => int.Parse(s.Split(' ')[1])).ToString());
对于LINQ万岁! :)
注意:没有错误捕获,我假设数据总是正确的。我没有测试代码的性能或错误。
答案 3 :(得分:0)
迭代列表。对于每个项目,请在" "
上拆分。将前缀(split [0])添加到(String:Integer)的映射中。如果字符串存在于map中,则首先检索其值,然后添加当前项值(split [1]),然后将总和添加回map。
最后,您的地图将为每个字符串添加总和。只需遍历地图项即可输出它。