-2

私は2つの配列を持っています:

 string[] array1 = {"a","b","c","d","e"}

 string[] array1 = {"x","y","a","b","a"}

次のように結果を印刷したい:

a = 3
b = 2
c = 1
d = 1
e = 1
x = 1
y = 1
z = 1

ループ内でループを実行してこれを見つけることができますが、同じ結果を達成するためのより良い方法はありますか?

LINQ を使用せずにプレーンな C# でこれを実行したいと考えています。

4

5 に答える 5

8

LINQ を使用してこれを実現できます。

var counts = array1.Concat(array2)
                  .GroupBy(v => v)
                  .Select(g => new { Value=g.Key, Number=g.Count() });

foreach(var item in counts.OrderBy(i => i.Value))
    Console.WriteLine("{0} = {1}", item.Value, item.Number);

何らかの理由で LINQ と拡張メソッドの使用を避けたい場合は、独自の辞書を作成できます。

var counts = new Dictionary<string, int>();
foreach(string item in array1)
{
    if (counts.ContainsKey(item))
        counts[item]++;
    else
        counts[item] = 1;
}
foreach(string item in array2)
{
    if (counts.ContainsKey(item))
        counts[item]++;
    else
        counts[item] = 1;
}

// Print out counts
foreach(var kvp in counts)
    Console.WriteLine("{0} = {1}", kvp.Key, kvp.Value);

これは結果をソートしないことに注意してください。ソートが必要な場合は、同様にソートする必要があります。

于 2012-09-05T20:38:22.477 に答える
5

ConcatGroupByおよびを使用できますOrderByDescending

var both = array1.Concat(array2);
var groups = both.GroupBy(s => s).OrderByDescending(g => g.Count());
Console.Write(
    String.Join(
        Environment.NewLine, 
            groups.Select(g => String.Format("{0} = {1}", g.Key, g.Count()))));
于 2012-09-05T20:38:34.593 に答える
1

2つの配列を読み、それらを1つの辞書に入れます。キーは、「a」、「b」などの配列のメンバーです。値は、カウントとしての整数です。したがって、キーが存在する場合は、カウントをインクリメントします。それ以外の場合は、キーを値1で辞書に入れます。

于 2012-09-05T20:44:46.053 に答える
1

これはLinqの仕事のようです:

var charCounts = array1.Concat(array2)
                    .GroupBy(c=>c)
                    .Select(g=>new Tuple<char, int>(g.Key, g.Count());
                    .OrderBy(t=>t.Item1);

foreach(var result in charCounts)
   Console.WriteLine(String.Format("{0} = {1}", t.Item1, t.Item2));
于 2012-09-05T20:39:09.487 に答える