2013-04-18 48 views
1

我有一個鍵對(鍵,val)的列表,其中鍵和值都是字符串。我想聚合具有重複鍵的元組。組和連接元組列表

For (key1, val1), (key2, val2), (key3, val3), (key1, val4), (key2, val5) 

我想輸出

(key1, val1+val4), (key2, val2+val5) 

這是我當前的查詢

var duplicates = Contents.Records.SelectMany(x => x.Users).Select(x => new { Name = x.Name, ID= x.ID}).GroupBy(x => x.ID).Select(x => new { x.Key, Names = x.Select(p=>p.Name).Aggregate((a,b) => a +","+b)}).ToArray(); 

但在月底在重複每個條目的成員名稱是空的。

數據如下每條記錄都有一個List Users。每個用戶都有一個名稱和一個ID。 我在做什麼錯?

+0

我沒有看到您的分組並選擇一個明顯的缺陷,並且確實可以運行,對樣本數據集,並得到了我認爲是你想要的結果。您是否檢查過輸入以驗證您期望的數據是否已加載?例如,拆分查詢並在'.SelectMany(...)。Select。(...)'後執行'ToList()'。你的數據看起來像你期望的那樣嗎? –

回答

1

Aggregate看起來應該做這項工作。但我從來沒有喜歡Aggregate。語法不直觀(在我看來)。通常其他方式看起來更清晰。就拿這一個:

Tuple<string,string>[] tuples = { 
            Tuple.Create("key1", "val1"), 
            Tuple.Create("key2", "val2"), 
            Tuple.Create("key3", "val3"), 
            Tuple.Create("key1", "val4"), 
            Tuple.Create("key2", "val5") 
           }; 
tuples.GroupBy(t => t.Item1, t => t.Item2) 
     .Select(g => Tuple.Create(g.Key, string.Join("+", g))) 
     .Dump(); // Linqpad output command 

結果:

key1 val1+val4 
key2 val2+val5 
key3 val3