我正在使用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。
答案 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;