C# 构建列表中项目计数的字典
我有一个列表,其中包含一组可以多次出现的字符串。我想以这个列表为基础,构建一个列表项字典作为键,并将它们出现的次数作为值 例如:C# 构建列表中项目计数的字典,c#,list,dictionary,C#,List,Dictionary,我有一个列表,其中包含一组可以多次出现的字符串。我想以这个列表为基础,构建一个列表项字典作为键,并将它们出现的次数作为值 例如: List<string> stuff = new List<string>(); stuff.Add( "Peanut Butter" ); stuff.Add( "Jam" ); stuff.Add( "Food" ); stuff.Add( "Snacks" ); stuff.Add( "Philosophy" ); stuff.Add(
List<string> stuff = new List<string>();
stuff.Add( "Peanut Butter" );
stuff.Add( "Jam" );
stuff.Add( "Food" );
stuff.Add( "Snacks" );
stuff.Add( "Philosophy" );
stuff.Add( "Peanut Butter" );
stuff.Add( "Jam" );
stuff.Add( "Food" );
我有办法做到这一点,但我似乎没有利用C#3.0中的好东西
public Dictionary CountStuff(IList stuffList)
{
Dictionary stuffCount=新建字典();
foreach(填充列表中的字符串填充){
//初始化或增加此项目的计数
if(stuffCount.ContainsKey(stuff)){
stuffCount[stuff]++;
}否则{
stuffCount.Add(stuff,1);
}
}
退货盘点;
}
一个想法是将字典a设为零,这样就不必在第一次出现时使用特殊情况。可以使用C#中的group子句来实现这一点
List<string> stuff = new List<string>();
...
var groups =
from s in stuff
group s by s into g
select new {
Stuff = g.Key,
Count = g.Count()
};
从这里开始,只需一小步即可将其放入词典中
:
没有比这更好的方法了
也许您可以编写一个LINQ查询,对字符串进行分组,然后计算每个组中有多少字符串,但这并不像您已经拥有的那样高效。我会制作一个专门的列表,由字典和add方法支持,该列表将测试成员资格,并在找到后增加计数 诸如此类:
public class CountingList
{
Dictionary<string, int> countingList = new Dictionary<string, int>();
void Add( string s )
{
if( countingList.ContainsKey( s ))
countingList[ s ] ++;
else
countingList.Add( s, 1 );
}
}
公共类计数列表
{
字典计数列表=新字典();
无效添加(字符串s)
{
if(countingList.ContainsKey)
计数列表[s]++;
其他的
添加(s,1);
}
}
Dictionary a=stuff.GroupBy(p=>p).OrderByDescending(r=>r.Count()).ToDictionary(q=>q.Key,q=>q.Count());
您可以分组,然后创建字典来计算每个组。如前所述,通常有比Linq更有效的方法。我认为您的代码效率更高,而Linq解决方案更具可读性和美观。好吧,那就是将处理特殊情况的代码移动到一个单独的类中……如何在第一个示例中添加orderby?@zadam您可以说
groups=groups.orderby(g=>g.Stuff)
;
List<string> stuff = new List<string>();
...
var groups =
from s in stuff
group s by s into g
select new {
Stuff = g.Key,
Count = g.Count()
};
var groups = stuff
.GroupBy(s => s)
.Select(s => new {
Stuff = s.Key,
Count = s.Count()
});
var dictionary = groups.ToDictionary(g => g.Stuff, g => g.Count);
public class CountingList
{
Dictionary<string, int> countingList = new Dictionary<string, int>();
void Add( string s )
{
if( countingList.ContainsKey( s ))
countingList[ s ] ++;
else
countingList.Add( s, 1 );
}
}
Dictionary<string, int> a = stuff.GroupBy(p => p).OrderByDescending(r=>r.Count()).ToDictionary(q => q.Key, q => q.Count());