Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 构建列表中项目计数的字典_C#_List_Dictionary - Fatal编程技术网

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());