C# 如何拆分字符串并基于匹配值获取和

C# 如何拆分字符串并基于匹配值获取和,c#,.net,C#,.net,我需要一点帮助。我生成了一个字符串列表来帮助收集一些信息。我需要重新拆分列表,根据匹配的名称添加值。我的字符串列表如下(包括中间栏): 红色| 5 红色| 3 蓝色| 2 红色| 6 绿色| 1 结果应为:红色=14蓝色=2绿色=1 我的实际代码如下: List<string> plist = new List<string>(); ObjectIdCollection mycoll = promptforObjColl("\nSelect Objects: ");

我需要一点帮助。我生成了一个字符串列表来帮助收集一些信息。我需要重新拆分列表,根据匹配的名称添加值。我的字符串列表如下(包括中间栏):

  • 红色| 5
  • 红色| 3
  • 蓝色| 2
  • 红色| 6
  • 绿色| 1
结果应为:红色=14蓝色=2绿色=1

我的实际代码如下:

List<string> plist = new List<string>();
ObjectIdCollection mycoll = promptforObjColl("\nSelect Objects: ");
foreach (ObjectId pid in mycoll)
{
    if (pid.GetType() == typeof(Polyline))
    {
        Polyline pcl = pid.GetObject(OpenMode.ForRead) as Polyline;
        plist.Add(pcl.StyleName + "|" + pcl.Area);
    }
}
List plist=new List();
objectdcollection mycoll=promptforObjColl(“\n选择对象:”);
foreach(mycoll中的ObjectId pid)
{
if(pid.GetType()==typeof(多段线))
{
多段线pcl=pid.GetObject(OpenMode.ForRead)作为多段线;
plist.Add(pcl.StyleName+“|”+pcl.Area);
}
}

我认为您必须交叉检查生成连接字符串的逻辑,然后遍历集合->拆分它们以获得实际值->处理它们以进行分组和求和等都非常昂贵,我更希望您使用字典,而不是像下面这样:

Dictionary<string,double> myDictionaryObj = new Dictionary<string,int>();

ObjectIdCollection mycoll = promptforObjColl("\nSelect Objects: ");
double currentValue;
foreach (ObjectId pid in mycoll)
{
    if (pid.GetType() == typeof(Polyline))
    {
        polyline pcl = pid.GetObject(OpenMode.ForRead) as Polyline;
        if(myDictionaryObj.TryGetValue(pcl.StyleName, out currentValue))
        {
            myDictionaryObj[pcl.StyleName]+= pcl.Area;
        }
        else
        {
            myDictionaryObj.Add(pcl.StyleName,pcl.Area);
        }
    }
}
double redSum = myDictionaryObj["Red"];

我认为您必须交叉检查生成串联字符串的逻辑,然后遍历集合->拆分它们以获得实际值->处理它们以进行分组和求和等都非常昂贵,我希望您使用字典,而不是像下面这样:

Dictionary<string,double> myDictionaryObj = new Dictionary<string,int>();

ObjectIdCollection mycoll = promptforObjColl("\nSelect Objects: ");
double currentValue;
foreach (ObjectId pid in mycoll)
{
    if (pid.GetType() == typeof(Polyline))
    {
        polyline pcl = pid.GetObject(OpenMode.ForRead) as Polyline;
        if(myDictionaryObj.TryGetValue(pcl.StyleName, out currentValue))
        {
            myDictionaryObj[pcl.StyleName]+= pcl.Area;
        }
        else
        {
            myDictionaryObj.Add(pcl.StyleName,pcl.Area);
        }
    }
}
double redSum = myDictionaryObj["Red"];

你试过什么?拆分字符串,对它们进行分组?当您在执行plist.Add时,为什么您没有一个字典来记录汇总?为什么要创建此列表?既然列表是基本数据类型,为什么不保留它呢?如果需要,可以使用它来获取字符串,比如序列化到文件?可能与您尝试的内容重复?拆分字符串,对它们进行分组?当您在执行plist.Add时,为什么您没有一个字典来记录汇总?为什么要创建此列表?既然这是基本数据类型,为什么不保留一个列表呢?如果需要,可以使用它来获取字符串,比如序列化到文件?myDictionaryObj[pcl.StyleName]+=currentValue的可能重复肯定是错误的。它应该是myDictionaryObj[pcl.StyleName]+=pcl.Area,或者myDictionaryObj[pcl.StyleName]=pcl.Area+currentValue。此外,还可以通过赋值立即添加字典条目,因此您可以将myDictionaryObj.Add(pcl.StyleName,pcl.Area)替换为myDictionaryObj[pcl.StyleName]=pcl.Area@Martheen:是的,你是对的,那应该是'myDictionaryObj[pcl.StyleName]+=pcl.Area;'我已经更新了我的帖子。感谢您的更正。因此,对于您当前的编辑,调用currentValue没有意义,对吗?只吃一点就够了,而不是吃一点TryGetValue@Martheen:再次感谢!但是我认为,
Contains()
需要遍历整个集合,因为它在一个循环中,这个操作将非常昂贵,这就是为什么我使用
TryGetValue
来代替
Contains
是一个O(1)操作,它不需要遍历,因为我们正在处理DictionaryDictionaryObj[pcl.StyleName]+=currentValue绝对错误。它应该是myDictionaryObj[pcl.StyleName]+=pcl.Area,或者myDictionaryObj[pcl.StyleName]=pcl.Area+currentValue。此外,还可以通过赋值立即添加字典条目,因此您可以将myDictionaryObj.Add(pcl.StyleName,pcl.Area)替换为myDictionaryObj[pcl.StyleName]=pcl.Area@Martheen:是的,你是对的,那应该是'myDictionaryObj[pcl.StyleName]+=pcl.Area;'我已经更新了我的帖子。感谢您的更正。因此,对于您当前的编辑,调用currentValue没有意义,对吗?只吃一点就够了,而不是吃一点TryGetValue@Martheen:再次感谢!但是我认为,
Contains()
需要遍历整个集合,因为它在一个循环中,这个操作将非常昂贵,这就是为什么我使用
TryGetValue
来代替
Contains
是O(1)操作,它不需要遍历,因为我们正在处理字典