2012-01-13 5 views
5

私は、ユーザが何らかの文字列を入力しなければならないプログラムを作成しています。プログラムはそれをリストまたは配列に格納し、次に何個項目を繰り返した回数。C#でアイテムが繰り返される回数を取得する

最も繰り返される3つの項目は、その後の繰り返しの回数が多い順に表示され

それは単純に聞こえ(第10リピートを有し、第二9を有し、第3 8を有しています)。私は多くの人々が、入力文字列の中に、私はリストを使用する方法が分からないので、この例に続く:

foreach (string value in list.Distinct()) 
{ 
    System.Diagnostics.Debug.WriteLine("\"{0}\" occurs {1} time(s).", value, list.Count(v => v == value)); 
} 

をしかし、いくつかの理由で、.Distinctは()私のリスト名の後に表示されません。私は間違ったことをしましたか?これは私のC#と関係がありますか?それはC#3.0ではありませんか?この例では、別の参照の追加などについて何も言及しませんでした。

これを行う方法は他にありますか?

+1

をあなたが3.0よりも古いものを使用している場合、それは – jolySoft

+0

で、あなたがアクセスすることはできませんどのようなネットのバージョンDistinctの拡張メソッドに変換します。 –

+0

あなたの期待している結果は何ですか?代わりにどのような結果が表示されますか? – jrummell

答えて

10

.Distinct()は、LINQ拡張メソッドです。それを使用するには.NET 3.5以降が必要です。

これで、あなたはしないでくださいあなたがしたいことを行うには、必要があります。他のコレクションクラスや算術演算を簡単に使用して結果を得ることができます。

// Create a dictionary to hold key-value pairs of words and counts 
IDictionary<string, int> counts = new Dictionary<string, int>(); 

// Iterate over each word in your list 
foreach (string value in list) 
{ 
    // Add the word as a key if it's not already in the dictionary, and 
    // initialize the count for that word to 1, otherwise just increment 
    // the count for an existing word 
    if (!counts.ContainsKey(value)) 
     counts.Add(value, 1); 
    else 
     counts[value]++; 
} 

// Loop through the dictionary results to print the results 
foreach (string value in counts.Keys) 
{ 
    System.Diagnostics.Debug 
     .WriteLine("\"{0}\" occurs {1} time(s).", value, counts[value]); 
} 
+0

.NET 3.5実際には(C#3) –

+0

@ThomasLevesque:ありがとう、私はそれを元々持っていたが、自分自身を推測した。 –

+0

とsystem.core.dllへの参照 –

0

使用している.NET Frameworkのバージョンは?このメソッドを含む最小のフレームワークバージョンは.NET 3.5です。

.NET 3.5以降を使用している場合、コードファイルにusing System.Linq;文がありますか?そうでない場合、おそらくその方法がアクセス可能ではないように見える理由です。 Distinctメソッドは、実際にはSystem.Linq名前空間にあるEnumerableクラスで定義されている拡張メソッドです。

0

あなたは、少なくともC#3.0と.NET 3.5を使用し、既存のソリューションと同様にusing System.Linq;

0

の追加について覚えておく必要があり、あなたが動作するように、このための.NET 3.5以上が必要になりますが、ここではとにかくです;

var query = list.GroupBy(x => x).OrderByDescending(x => x.Count()).Take(3); 

foreach (var result in query) 
{ 
    Console.WriteLine("\"{0}\" occurs {1} time(s).", result.Key, result.Count()); 
} 
2

C#3.0をお持ちでない場合は、拡張メソッドがありません。

.NET3.5を使用していない場合、静的として呼び出すLinq拡張メソッドはありません。

あなたは機能のこれらの作品のかなりの数のために独自に追加することができます

public static IEnumerable<T> Distinct(IEnumerable<T> src, IEqualityComparer<T> eCmp) 
{ 
    Dictionary<T, bool> fakeHashSet = new Dictionary<T, bool>(eCmp); 
    //When I coded for 2.0 I had my own custom HashSet<T>, but that's overkill here 
    bool dummy; 
    foreach(T item in src) 
    { 
    if(!fakeHashSet.TryGetValue(item, out dummy)) 
    { 
     fakeHashSet.Add(item, true); 
     yield return item; 
    } 
    } 
} 
public static IEnumerable<T> Distinct(IEnumerable<T> src) 
{ 
    return Distinct(src, EqualityComparer<T>.Default); 
} 
public delegate TResult Func<T, TResult>(T arg);//we don't even have this :(
public static int Count(IEnumerable<T> src, Func<T, bool> predicate) 
{ 
    int c = 0; 
    foreach(T item in src) 
    if(predicate(item)) 
     ++c; 
    return c; 
} 

我々は、拡張構文、またはlamdbasを​​持っていないので、我々は同じようにそれらを呼び出す必要があります:

foreach (string value in Distinct(list)) 
{ 
    System.Diagnostics.Debug.WriteLine("\"{0}\" occurs {1} time(s).", value, Count(list, delegate(string v){return v == value;})); 
} 

C#2.0で多くのLinq-to-objectを実装することができますが、多くの人がやりましたが、それほどフレンドリーではありません。もちろん、他のクエリプロバイダにはマッピングできません。この場合

は、しかし、あなたは速いだけの直接のカウントをやっていると思います:

Dictonary<string, int> counts = new Dictionary<string, int>(); 
foreach(string value in list) 
{ 
    if(counts.ContainsKey(value)) 
    counts[value]++; 
    else 
    counts[value] = 1; 
} 
foreach(KeyValuePair<string, int> kvp in counts) 
    System.Diagnostics.Debug.WriteLine("\"{0}\" occurs {1} time(s).", kvp.Key, kvp.Value)); 
関連する問題