2016-11-08 51 views
3

我有list<string>隨機數量的條目(介於10-500之間)。我需要找到最少發生時間的值。例如,list<string> myList100 "a", 50 "b", 2 "c", and 1 "d",我希望提取「c」和「d」。我的問題是,我永遠不會知道每個字符串的確切數量,以及列表中字符串的確切名稱。查找列表中最少出現的成員C#

出於類似的比喻,檢查下面的代碼:

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     Random r = new Random();     

     int randomNumber = r.Next(5,15); 
     int randomRangeOne = r.Next(0,2); 
     int randomRangeTwo = r.Next(0,2); 

     List<int> randomList = new List<int>(); 

     for(int i = 0; i < 1000; i++) 
     { 
      int x = r.Next(randomNumber - randomRangeOne, randomNumber + randomRangeTwo); 
      randomList.Add(x); 
     }    
    } 
} 

在這種情況下(在實際的問題,它是隨機的字符串,而不是隨機INT),我怎麼會提取至少在列表中出現的值?

+0

你要得到至少發生字符字符串或最少出現的字符串?例如,如果你有''你好「,」你好「,」再見「,結果是''再見''或''y」和「b」'? – dotctor

+0

我想要最少發生的字符串本身。在你的例子中,我想要「再見」 – djskj189

+0

我說過類似的比喻,請閱讀 – djskj189

回答

7

下面是一個簡單的LINQ

var leastOccured = data 
    .GroupBy(x => x) 
    .OrderBy(group => group.Count()) 
    .Select(x => x.Key) 
    .First(); 

你相同組串,每個組上升的數量進行排序,並採取第一種是在至少至少發生串。

如果可以有多個字符串與同一事故算你可以使用下面

var ordered = data 
    .GroupBy(x => x) 
    .Select(group => new { group.Key, Count = group.Count() }) 
    .OrderBy(x => x.Count); 

var minOccurrenceCount = ordered.First().Count; 

var leastOccurredStrings = ordered 
    .TakeWhile(x => x.Count == minOccurrenceCount) 
    .Select(x => x.Key); 
+0

@doctor這個問題查詢應該按降序排序,因爲問題提到最少發生需要拉。 –

+2

@PratikGaikwad不,升序是正確的。 –

1

從邏輯上思考這些步驟,如果你必須這樣做,你如何在現實生活中做到這一點?

  1. 查看列表,在找到它們時在每個項目的方框中打一個理貨標記。
  2. 一旦你完成了對從最小到最大的理貨標記進行分類。
  3. 拿第一個盒子並使用它。

你可以在你的程序中做同樣的事情。我覺得這是作業,所以我不會提供一個如何做所有三個步驟的代碼示例,但希望這會讓你走上正確的軌道。

2

代碼如果你想獲得所有具有可以做到這兩步最低計數的值。

var lowestCount = stringList.GroupBy(x => x) 
          .Select(x => x.Count()) 
          .Min(); 
var result = stringList.GroupBy(x => x) 
         .Where(x => x.Count() == lowestCount) 
         .Select(x => x.Key); 

我用下面的輸入數據:

var stringList = new List<string> { "a", "a", "a", "b", "b", "c", "c", "d","d" }; 

有了這個輸入result持有 「B」, 「C」, 「d」