2016-11-04 55 views
0

如果我有喜歡收藏:LINQ遍歷集合和增量追加到匹配值

var list = new List<string>() 
    { 
     "one", 
     "one", 
     "two", 
     "two", 
     "three" 
    }; 

是有可能得到的結果類似下面使用LINQ?

「一1」,「一2」,「兩-1」,「雙2」,「三」

我試圖讓重複的值和連續的數字追加到他們做他們獨特的

|編輯

我LinqPad這樣做,似乎是正確的......

Dictionary<string,string> names = new Dictionary<string,string>(){ 

    {"val1","text1"}, 
    {"val2","text1"}, 
    {"val3","text2"}, 
    {"val4","text3"}, 
    {"val5","text3"} 

}; 

var filteredNames = names.GroupBy (x => x.Value).ToDictionary(x => x.Key, x => x.Select((i, index) => i.Value + index.ToString())); 

建議歡迎!

+0

你的問題有點混亂,你可以編輯它,並使其更清楚。 –

+0

如果可以,你不明白哪個部分? – DavidB

+0

好吧,一個令人困惑的事情似乎是你的問題說,你是從一個列表開始,然後你有一些示例代碼,以字典開頭... – Chris

回答

1

從你應該做的啓動列表如下:

var filteredNames = list.GroupBy (x => x).SelectMany((i, index) => i.Value + "-" + index.ToString()); 

從字典您的解決方案是正確的開始,但如果你想作爲一個結果列表,你應該做如下:

var filteredNames = names.GroupBy (x => x.Value).SelectMany((i, index) => i.Value + "-" + index.ToString()); 
+0

這看起來像它不會保留排序,如果這是相關的。 – Chris

+0

第一個似乎不是一個正確的解決方案,不會有任何'i.Value',也SelectMany會產生'IEnumerable ',而不是'IEnumerable ' –

0

檢查之後,將提供準確的預期結果,也將保留訂單,因爲它列舉(Linqpad代碼):

// Grouping 
var resultGroup = list.GroupBy(x => x); 

// Enumeration 
foreach (var grp in resultGroup) 
{ 
    if(grp.Count() == 1) 
     grp.Key.Dump(); 
    else 
    { 
     int counter = 0; 
     foreach (var index in grp) 
     { 
      counter++; 
      (grp.Key + "-" + counter).Dump(); 
     } 
    } 
}