C#-当有3个字符时拆分字符串并将值添加到字典中

C#-当有3个字符时拆分字符串并将值添加到字典中,c#,string,dictionary,split,count,C#,String,Dictionary,Split,Count,我有这样一个字符串: var totalOrders = "Beans - 1\nMeat balls - 1\nBrown bread - 2\nBeans - 2\nBanana slice - 1\nSteak with rice - 1\nBrown bread - 1\n"; 它是动态创建的,所以这个只是为了举例。数字表示订购了多少份。我需要根据食物的名称将其拆分为一个键,并计算订购了多少份,这将是一个值 我已尝试使用此方法拆分字符串,首先使用“\n”,然后使用“-”: count

我有这样一个字符串:

var totalOrders = "Beans - 1\nMeat balls - 1\nBrown bread - 2\nBeans - 2\nBanana slice - 1\nSteak with rice - 1\nBrown bread - 1\n";
它是动态创建的,所以这个只是为了举例。数字表示订购了多少份。我需要根据食物的名称将其拆分为一个键,并计算订购了多少份,这将是一个值

我已尝试使用此方法拆分字符串,首先使用“\n”,然后使用“-”:

count = totalOrders.Split('\n').ToDictionary(item => item.Split(" - ")[0], item => int.Parse(item.Split(" - ")[1]));
但我得到一个错误“无法从字符串转换为字符。我必须使用双引号,因为“-”有3个字符(2个空格和一个破折号),它不能被识别为字符

另外,我认为问题将出现在我开始添加食物时,因为它会报告,考虑到食物不止一次出现,键不会是唯一的。如何解决这个问题

编辑:

当我尝试这个:

string[] countOrders = totalOrders.Split('\n');
string[] parts1 = countOrders.Split(new string[] { " - " }, StringSplitOptions.None);
我在.Split上出错了

'string[]' does not contain a definition for 'Split' and no extension method 'Split' accepting a first argument of type 'string[]' could be found
如果我尝试这个“string countOrders=”(所以没有[]),我得到


我不明白当字符串在这两种情况下都出现错误时,我应该如何将字符串拆分为“\n”,然后再拆分为“-”?

您有两个问题

问题1:

这里回答了如何按多个字符拆分:。下面的代码直接来自这里

问题2:

您需要检查字典,查看食物是否已作为键存在。如果已存在,则只需更新该食物的值。如果它不作为键存在,请将其作为新项添加到字典中

if (!foodDict.ContainsKey(food))
{
     foodDict.Add(food, qty);
}
else
{
     foodDict[food] += qty;
}

你有两个问题

问题1:

这里回答了如何按多个字符拆分:。下面的代码直接来自这里

问题2:

您需要检查字典,查看食物是否已作为键存在。如果已存在,则只需更新该食物的值。如果它不作为键存在,请将其作为新项添加到字典中

if (!foodDict.ContainsKey(food))
{
     foodDict.Add(food, qty);
}
else
{
     foodDict[food] += qty;
}

您需要拆分并清除空条目。
您可以在
'-'
上进行拆分,而无需在
“-”

然后,分组并求和,得到一个总字典

Dictionary<string, int> count =
    totalOrders.Split(new[] {'\n'}, StringSplitOptions.RemoveEmptyEntries)
        .Select(item => item.Split(new[] {'-'}, StringSplitOptions.RemoveEmptyEntries))
        .Select(arg=> new {Key = arg[0].Trim(), Val=  int.Parse(arg[1].Trim())})
        .GroupBy(arg=>arg.Key)
        .ToDictionary(g => g.Key, g => g.Sum(arg=>arg.Val));
字典计数=
totalOrders.Split(新[]{'\n'},StringSplitOptions.RemoveEmptyEntries)
.Select(item=>item.Split(新[]{'-},StringSplitOptions.RemoveEmptyEntries))
.Select(arg=>new{Key=arg[0].Trim(),Val=int.Parse(arg[1].Trim())})
.GroupBy(arg=>arg.Key)
.ToDictionary(g=>g.Key,g=>g.Sum(arg=>arg.Val));

您需要拆分并删除空条目。
您可以在
'-'
上进行拆分,而无需在
“-”

然后,分组并求和,得到一个总字典

Dictionary<string, int> count =
    totalOrders.Split(new[] {'\n'}, StringSplitOptions.RemoveEmptyEntries)
        .Select(item => item.Split(new[] {'-'}, StringSplitOptions.RemoveEmptyEntries))
        .Select(arg=> new {Key = arg[0].Trim(), Val=  int.Parse(arg[1].Trim())})
        .GroupBy(arg=>arg.Key)
        .ToDictionary(g => g.Key, g => g.Sum(arg=>arg.Val));
字典计数=
totalOrders.Split(新[]{'\n'},StringSplitOptions.RemoveEmptyEntries)
.Select(item=>item.Split(新[]{'-},StringSplitOptions.RemoveEmptyEntries))
.Select(arg=>new{Key=arg[0].Trim(),Val=int.Parse(arg[1].Trim())})
.GroupBy(arg=>arg.Key)
.ToDictionary(g=>g.Key,g=>g.Sum(arg=>arg.Val));

这里是一个非linq选项,因为它是OP请求的,我个人更喜欢linq方式,但是这会产生相同的结果

 var totalOrders = "Beans - 1\nMeat balls - 1\nBrown bread - 2\nBeans - 2\nBanana slice - 1\nSteak with rice - 1\nBrown bread - 1\n";
 var DictionaryHolder = new Dictionary<string, int>();
 //Split initial string into array and remove empties
 string[] initialArray = totalOrders.Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);

        foreach (var item in initialArray)
        {
            // Get the string Key or Entree
            string key = item.Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries)[0].Trim();
            //  Get the Count of Portions
            int count = int.Parse(item.Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries)[1].Trim());

            // check if Dictionary has the key already if not add it
            if (!DictionaryHolder.ContainsKey(key))
            {
                DictionaryHolder.Add(key, count);
            }
            else
            {
                // If the dictionary already had that key increase portion count by amount ordered.
                DictionaryHolder[key] = DictionaryHolder[key] + count;
            }
        }
var totalOrders=“豆子-1\n蛋卷-1\n面包-2\n面包-2\n香蕉片-1\n米饭馅-1\n面包-1\n”;
var DictionaryHolder=新字典();
//将初始字符串拆分为数组并删除空字符串
string[]initialArray=totalOrders.Split(新字符[]{'\n'},StringSplitOptions.RemoveEmptyEntries);
foreach(initialArray中的变量项)
{
//获取字符串键或主菜
string key=item.Split(新字符[]{'-},StringSplitOptions.RemoveEmptyEntries)[0].Trim();
//得到份数
int count=int.Parse(item.Split(新字符[]{'-},StringSplitOptions.RemoveEmptyEntries)[1].Trim());
//检查字典是否已经有密钥,如果没有,请添加它
如果(!DictionaryHolder.ContainsKey(键))
{
DictionaryHolder.Add(key,count);
}
其他的
{
//如果字典已经有了该键,则按订购量增加部分计数。
DictionaryHolder[键]=DictionaryHolder[键]+计数;
}
}

这里是一个非linq选项,因为它是OP请求的,我个人更喜欢linq方式,但是这会产生相同的结果

 var totalOrders = "Beans - 1\nMeat balls - 1\nBrown bread - 2\nBeans - 2\nBanana slice - 1\nSteak with rice - 1\nBrown bread - 1\n";
 var DictionaryHolder = new Dictionary<string, int>();
 //Split initial string into array and remove empties
 string[] initialArray = totalOrders.Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);

        foreach (var item in initialArray)
        {
            // Get the string Key or Entree
            string key = item.Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries)[0].Trim();
            //  Get the Count of Portions
            int count = int.Parse(item.Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries)[1].Trim());

            // check if Dictionary has the key already if not add it
            if (!DictionaryHolder.ContainsKey(key))
            {
                DictionaryHolder.Add(key, count);
            }
            else
            {
                // If the dictionary already had that key increase portion count by amount ordered.
                DictionaryHolder[key] = DictionaryHolder[key] + count;
            }
        }
var totalOrders=“豆子-1\n蛋卷-1\n面包-2\n面包-2\n香蕉片-1\n米饭馅-1\n面包-1\n”;
var DictionaryHolder=新字典();
//将初始字符串拆分为数组并删除空字符串
string[]initialArray=totalOrders.Split(新字符[]{'\n'},StringSplitOptions.RemoveEmptyEntries);
foreach(initialArray中的变量项)
{
//获取字符串键或主菜
string key=item.Split(新字符[]{'-},StringSplitOptions.RemoveEmptyEntries)[0].Trim();
//得到份数
int count=int.Parse(item.Split(新字符[]{'-},StringSplitOptions.RemoveEmptyEntries)[1].Trim());
//检查字典是否已经有密钥,如果没有,请添加它
如果(!DictionaryHolder.ContainsKey(键))
{
DictionaryHolder.Add(key,count);
}
其他的
{
//如果字典已经有了该键,则按订购量增加部分计数。
DictionaryHolder[键]=DictionaryHolder[键]+计数;
}
}

只是查看一下,您可能需要在split方法调用中添加字符串拆分选项remove清空,因为您在最后得到的是一个没有任何内容的附加项。如果int.Parse异常,则该项可能是原因。因此,您的拆分调用类似于totalOrders.split(新字符[]{'\n'},StringSplitOptions.RemoveEmptyEntries)棕色面包也在其中两次,所以您将得到重复的密钥异常。下面的答案有多复杂