3

我正在为 Windows Phone 7 使用 C#、Silverlight、Visual Studio。

我目前有一个包含通用 UIElement 的列表,我可以将 TextBlock 或 Grid 或 StackPanel 之类的东西放入列表中。

例如:

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) 性能更好的东西。我当前的解决方案将每个元素类型与列表中的其余元素类型进行比较,类似于 BubbleSort。

4

5 回答 5

5

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

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

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

于 2012-09-17T11:27:36.787 回答
3

试用

var loader = loaders.OfType<Elementtype>().Count(); 
于 2012-09-17T09:51:35.020 回答
3
var types = UIList.GroupBy(ui => ui.GetType())
        .Select(g => new { Type = g.Key, Count = g.Count() })
        .ToList();
于 2012-09-17T09:54:51.167 回答
2

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

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

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

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

或者,如果您对一种简短有效的方法感兴趣您可能希望使用ConcurrentDictionarywith it 的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 回答