2012-07-14 99 views
4

我剛開始學習LINQ。我寫了下面的linq表達式來獲取重複3次的列表中的數字。將Linq查詢表達式轉換爲點表示法

var query = from i in tempList 
      where tempList.Count(num => num == i) == 3 
      select i; 

我想知道如何將其轉換爲點符號。

回答

5

你可以使用Enumerable.GroupBy

var query = tempList 
      .GroupBy(i => i) 
      .Where(g => g.Count() == 3) 
      .Select(g => g.Key); 

例如:

var tempList = new List<Int32>(){ 
    1,2,3,2,2,2,3,3,4,5,6,7,7,7,8,9 
}; 
IEnumerable<int> result = tempList 
.GroupBy(i => i) 
.Where(g => g.Count() == 3) 
.Select(g => g.Key); 

Console.WriteLine(string.Join(",",result)); 

結果:3,7

我使用的HashSet得到查詢
+0

感謝您的答案和它運作良好的例子! – kr13 2012-07-14 22:48:39

1

一個文字換算如下:

var query = tempList.Where(i => tempList.Count(num => num == i) == 3); 

蒂姆已經提到的,你也可以做到這一點使用的GroupBy:

var query = tempList.GroupBy(i => i).Where(g => g.Count() == 3).Select(g => g.Key); 

注意,GroupBy版本只返回一個每個數字的副本,不像你的代碼,返回每個數字的三個副本。雖然我懷疑你只想得到每個號碼的一個副本。

+0

這就是正確的:爲什麼不直接調用'Distinct()'? – kr13 2012-07-14 22:47:39

+0

@ KR13後不同的元素 – 2012-07-14 22:48:50

+0

嗯,我想我讀了一些使用HashSet更有效的地方 – kr13 2012-07-14 22:49:52