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)棕色面包也在其中两次,所以您将得到重复的密钥异常。下面的答案有多复杂