3

C#、Silverlight、Visual Studio for Windows Phone 7 を使用しています。

現在、汎用 UIElement を含むリストがあり、TextBlock、Grid、StackPanel などをリストに配置できます。

例えば:

List<UIElement> UIList= new List<UIelement>();
UIList.Add(someUIObject as UIElement);

私の質問は、リスト内のオブジェクト タイプの数を効率的にカウントする方法はありますか? たとえば、8 つの TextBlock と 4 つの Grid がある場合、List に 2 つのオブジェクト タイプがあることを知りたいと思います。または、TextBlock が 1 つ、Grid が 1 つ、StackPanel が 1 つある場合、オブジェクトには 3 つのタイプがあることを知りたいです。

O(n^2) のパフォーマンスよりも優れたものを探しています。私の現在のソリューションは、BubbleSort に似た、List 内の各要素タイプを残りの要素タイプと比較します。

4

5 に答える 5

5

コレクション内のさまざまなタイプの数を取得するには、LINQを使用して最初に各オブジェクトのタイプを選択し、次に個別のタイプのみを取得してそれらをカウントします。

int numberOfTypes = UIList.Select(x => x.GetType()).Distinct().Count();

Distinct()ハッシュテーブルを使用するため、これはすべてO(n)になります。

于 2012-09-17T11:27:36.787 に答える
3
var types = UIList.GroupBy(ui => ui.GetType())
        .Select(g => new { Type = g.Key, Count = g.Count() })
        .ToList();
于 2012-09-17T09:54:51.167 に答える
3

試してみる

var loader = loaders.OfType<Elementtype>().Count(); 
于 2012-09-17T09:51:35.020 に答える
2

あなたが得ることができる最高O(n)のものは、リストの要素をループすることによる複雑さです。LINQ を使用することもできます。

int numberOfTextBoxes = UIList.OfType<TextBox>().Count();
于 2012-09-17T09:51:32.913 に答える
0

あなたの質問は次のように理解しています。コレクション内の各タイプをカウントしたいのです。

GroupBy次に、LINQと、たとえば a を使用できますDictionary<String, Int32>。ここで、キーは型の名前で、値はリスト内のその型の出現回数です。

Dictionary<String, Int32> typeCounts = UIList
    .GroupBy(c => c.GetType().FullName)
    .ToDictionary(g => g.Key, g => g.Count());

代わりに、リストにいくつの異なるタイプがあるかを知りたいだけの場合は、上記の辞書のCountプロパティを使用するか、次のようにします。

int diffTypeCount = UIList.GroupBy(c => c.GetType().FullName).Count();

または、短く効率的なアプローチに興味がある場合は、そのメソッドConcurrentDictionaryでを使用することをお勧めします。AddOrUpdate

var typeCounts = new System.Collections.Concurrent.ConcurrentDictionary<String, Int32>();
foreach (var c in UIList)
{
    typeCounts.AddOrUpdate(c.GetType().FullName, 1, (typeName, count) => count + 1); 
}
int diffTypeCount = typeCounts.Count;
于 2012-09-17T09:55:48.870 に答える