2012-03-19 20 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]),然後將該和添加回地圖。

最後你的地圖將有每個字符串的總和。只需遍歷地圖項目即可輸出它。