2011-05-05 106 views
3

鑑於這樣C#的LINQ的GroupBy

「Val.1.ValueA」
「Val.1.ValueB」
「Val.1.ValueC」
「Val.2.ValueA字符串列表「
」Val.2.ValueB「
」Val.2.ValueC「
」Val.3.ValueA「
」Val.3.ValueB「
」Val.3.ValueC「

我怎麼能夠寫一個linq groupby語句,以包含數字的字符串的第一部分進行分組?換句話說,在上述情況下,我想3組Val.1,Val.2列表,Val.3

+3

關閉投票,僅僅因爲這不是你*會遇到的事情,並不意味着它太過本地化而無法負責。 – BoltClock 2011-05-05 17:58:15

+0

歡迎來到StackOverflow – 2011-05-05 18:03:28

回答

5

使用String.Split()來定義您的組密鑰:

var groups = myList.GroupBy(x => { var parts = x.Split('.'); 
            return parts[0] + parts[1]; }); 

這會工作,無論鍵的兩個部分的長度(在點之前和之後)。

編輯迴應評論:

這聽起來像你要組由字符串中的數字,但你不提前其中部分構成的號碼百事通。在這種情況下,這應該工作:

var groups = myList.GroupBy(x => 
    { 
     var parts = x.Split('.')); 
     int num = 0; 
     return parts[0] + parts.Where(p => p.All(char.IsDigit) 
           .First(p => int.TryParse(p, out num)); 
    } 
); 
5

沒有更多的信息有關的格式,最簡單的是:

var groups = list.GroupBy(s => s.Substring(0, 5)); 

如果這些其實都不是固定長度:

var groups = list.GroupBy(s => { 
    var fields = s.Split('.'); 
    return String.Format("{0}.{1}", fields[0], fields[1]); 
}); 
+0

對,我應該添加更多信息。在我的情況下,數字在字符串中的另一個地方。換句話說,它可能是Val.AnotherString.2.ValueB。我試圖使用正則表達式 – salmonrushdie 2011-05-05 18:00:28

+0

你是說它可能是'Val.1'和'Val.X.1'混合(這裏,'X'是'string'不包含'.')? – jason 2011-05-05 18:01:51

+0

但是訣竅是我可能不知道哪裏的.number。是 – salmonrushdie 2011-05-05 18:04:56