2015-04-06 82 views
-3

所以我遇到的問題是我想要計算列表中枚舉的倍數。比如說,我有一個「Hi」「Hi」「Hello」「Hi」和「Hello」的列表。C#:計數列表中的倍數

有沒有一種方法,我可以搜索數組,並找出有3個「嗨」,而不必做List.Where x =「Hi」>?

謝謝了。

+0

那麼「你好」呢?你也要測試一下嗎?請發佈您的C#代碼。 –

+0

我想知道「Hello」是否也有倍數。從我在網上找到的,以及我對c#的基本知識,我只看到了.Where <>功能,但是我必須預先定義列表中要查找的枚舉或字符串。我想知道是否有辦法讓它只計算枚舉或字符串本身並返回它們的倍數。 –

+0

所以你想要一個只包含多個枚舉的結果列表? – Coder1409

回答

0

要計算列表中的某個元素的出現次數,你可以簡單地做:

List.Count(x => x == "Hi"); 

編輯:如果你只是想講的速記方式,其元素出現N次,你可以做到與嵌套查詢:

List<string> greetings = new List<string> {"Hi", "Hi", "Hello", "Hello", "Hi"}; 

List<string> greetingsThatOccurThreeTimes = greetings 
    .Where(s1 => greetings.Count(s2 => s1 == s2) == 3).ToList(); 

編輯#2:您還可以通過使用擴展方法清理它。

通過聲明如下:

public static class ListExtensions 
{ 
    public static List<T> WithNOccurrences<T>(this List<T> source, int n) 
    { 
     return source.Where(s1 => source.Count(s2 => s1.Equals(s2)) == n).ToList(); 
    } 
} 

你可以做你的調用代碼是這樣的:

List<string> greetings = new List<string> {"Hi", "Hi", "Hello", "Hello", "Hi"}; 

// This list will only contain "Hi" (but 3 times, though) 
List<string> greetingsThatOccurThreeTimes = greetings.WithNOccurrences(3); 

這應該更接近你的 「ThreeOfAKind ==真」。

如果你只是想找回出現N次的每個項目之一,只需添加.Distinct()的擴展方法,像這樣:

public static class ListExtensions 
{ 
    public static List<T> WithNOccurrences<T>(this List<T> source, int n) 
    { 
     return source 
      .Where(s1 => source.Count(s2 => s1.Equals(s2)) == n) 
      .Distinct().ToList(); 
    } 
} 
+0

那麼,我在想什麼就像列表中有3個hi和2個hello。我們要計算這些項目的倍數。這些項目可能在list.GroupBy <>函數中工作,但是我想知道是否有一種方法,當我們迭代列表並在列表中找到三個「hi」時,我們可以擁有「threeofAkind = true」。 –

+0

我已經添加了一個擴展方法,就是這麼做的。那是你在找什麼? –

+0

這正是我所期待的。謝謝。我對編碼相對來說比較陌生,我們只是說大學並沒有向我們講述這樣的事情。 –

2

你可以嘗試LINQ的計算頻率,例如:

List<String> source = new List<string>() { 
    "Hi", "Hi", "Hello", "Hi", "Hello" 
}; 

Dictionary<String, int> freqs = source 
    .GroupBy(item => item) 
    .ToDictionary(item => item.Key, 
       item => item.Count()); 

.... 
int freqHi = freqs["Hi"]; // 3 
0

這LINQ查詢會給你有哪些項目列表複製

var mutiples = l.GroupBy(e => e).Where(c=>c.Count()>1); 

您可以通過mutiples列表使用此代碼

foreach (var pair in mutiples) 
      Console.WriteLine(pair.Key + " " + pair.Count()); 
0

在這裏你去遍歷:

 public List<string> GetDuplicates(List<string> list) 
     { 
      var q = from s in list 
        group s by s into g 
        select new { str = g.Key, count = g.Count() }; 

      return q.Where(str => str.count > 1).Select(str => str.str).ToList<string>(); 
     } 
0
string words = "Hi, Hi, Hello, Hi, Hello"; 
var countList = words.Split(new[] { " " }, StringSplitOptions.None); 
int count = countList.Where(s => s.Contains("Hi")).Count(); 

數= 3運行該代碼時。

0

您必須先對它們進行分組,然後執行選擇操作。如果你問算來,一個例子可以是:

List<string> stringList = new List<string>{ "hi", "hi", "hi", "hello" }; 
stringList.GroupBy(i => i).Select(i => new {i.Key, i.ToList().Count }).ToList(); 
0

看到這個SO發佈https://stackoverflow.com/a/10812657/1339616

您還可以使用LINQ查詢語法是這樣的。

from s in new List<string> {"Hi", "Hi", "Hello", "Hi", "Hello"} 
group s by s into g 
where g.Count() > 1 
orderby g.Count() descending 
select new {Key = g.Key, Count = g.Count() }