2012-03-19 22 views
1

列表替换元素的一部分,我有一个包含一些字符串类似下面的列表:在字符串

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(); 

我的方法是不正确的,在所有的,所以我要问你帮帮我。

回答

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); 
} 

此代码显然忽略检查了一堆错误的(如果字符串不拆分会发生什么,还是没有可以解析的第二个组件?),但可以在没有太多困难的情况下添加。

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(); 
1
List<string> outputList = 
    inputList.GroupBy(s => s.Split(' ')[0]) 
      .Select(g.Key + " " + g.Sum(s => int.Parse(s.Split(' ')[1])).ToString()); 

万岁LINQ! :)

注意:没有错误捕获,并且我假定数据总是正确的。我还没有测试性能或错误的代码。

0

遍历列表。对于每个项目,拆分" "。将前缀(splits [0])添加到(String:Integer)的映射中。如果字符串存在于地图中,则先检索其值,然后添加当前项目值(split [1]),然后将该和添加回地图。

最后你的地图将有每个字符串的总和。只需遍历地图项目即可输出它。