列表中不同对象类型的数量

时间:2012-09-17 09:48:58

标签: c# list counting

我正在使用C#,Silverlight,Visual Studio for Windows Phone 7。

我目前有一个包含通用UIElement的List,我可以把TextBlock或Grid或StackPanel这样的东西放到List中。

例如:

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

我的问题是,是否有一种有效的方法来计算列表中对象类型的数量?例如,如果有8个TextBlocks和4个Grids,我想知道List中有2个对象类型。或者,如果有1个TextBlock,1个Grid和1个StackPanel,我想知道有3种类型的对象。

我正在寻找比O(n ^ 2)性能更好的东西。我当前的解决方案将每个元素类型与List中的其他元素类型进行比较,类似于BubbleSort。

5 个答案:

答案 0 :(得分:5)

要获取集合中不同类型的数量,我会使用LINQ首先选择每个对象的类型,然后只采用不同类型并计算:

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

所有这些都是O(n),因为Distinct()使用哈希表。

答案 1 :(得分:2)

通过循环遍历列表的元素,您可以获得的最佳效果是O(n)。你也可以使用LINQ:

int numberOfTextBoxes = UIList.OfType<TextBox>().Count();

答案 2 :(得分:2)

试试

var loader = loaders.OfType<Elementtype>().Count(); 

答案 3 :(得分:2)

var types = UIList.GroupBy(ui => ui.GetType())
        .Select(g => new { Type = g.Key, Count = g.Count() })
        .ToList();

答案 4 :(得分:0)

我通过以下方式理解您的问题:您想要计算集合中的每种类型。

然后你可以使用LINQ GroupBy,例如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;