替换字符串列表中元素的一部分

时间:2012-03-19 20:06:21

标签: c# linq list

我有一个列表,其中包含一些字符串,如下所示:

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

我的方式根本不正确所以我想请你帮忙。

4 个答案:

答案 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。

最后,您的地图将为每个字符串添加总和。只需遍历地图项即可输出它。