c# - 根据条件和发生将集合拆分为对象

标签 c# .net arrays linq object

给定以下数组(每个 block [] 代表一个条目):

[A=1] [A=5] [S=3] [A=7] [C=3] [T=2] [F=9] [Z=4] [N] [C=3] [E=8]
[A=7] [N] [Z=6] [Q=1] [P=2] [Y=7] [S=3] [N] 

我需要将它拆分为“N”类型的对象 (NObject),其中每个其他字符代表该 NObject 对象的特定属性,直到下一次出现“N”。在第一次出现“N”之前,字符属于另一个对象(我们称之为 PObject)。因此,任务应满足以下条件:

  1. 将每个字符映射到一个 PObject 属性
  2. 当第一个“N”出现时,创建一个新的 NObject
  3. 将每个字符映射到该 NObject 的属性
  4. 如果出现另一个 N 字符,则创建一个新的 NObject

目前,在伪代码中,我的解决方案如下所示,但我发现它远非理想。

PObject pobject = new PObject();
NObject nobject;

CollectionOfKeyValuePairs collection = MyArray.Split('=').MapKeysValues()

foreach(entry in collection) {
    switch(entry.Key):
        case A:
            (nobject ?? (CommonBase) pobject).A += entry.Value; break;
        case B:
            (nobject ?? (CommonBase) pobject).B += entry.Value; break;
        case C:
            (nobject ?? (CommonBase) pobject).C += entry.Value; break;
        case E:
            pobject.E += entry.Value; break;
        case F:
            (nobject ?? (CommonBase) pobject).F += entry.Value; break;
        case G:
            (nobject ?? (CommonBase) pobject).G += entry.Value; break;
        case H:
            (nobject ?? (CommonBase) pobject).H += entry.Value; break;
        ...
        ...
        ...
        case N:
             nobject = new NObject();
        ....
        ....
    }
}

这正是我想要的:

[pobject]
A = 23
B = 63
C = 23
...

[nobject]
A = 34
B = 82
C = 12
...

[nobject]
H = 236
K = 2
...

[nobject]
// N occurred in array, but no properties followed

但是有超过 30 个可能的属性标识符(这意味着 30 个切换条件)和一个仅基于 nobject 可能为 null 的事实分配的属性(并且在每个 'N' 个字符出现时创建一个新的):代码非常臭.但我不知道如何做不同的事情,也许使用内置的集合函数、LINQ 或其他任何东西。

最佳答案

您可以使用字典来存储键值对,而不是为每种可能的情况显式创建属性。像这样的东西:

List<Dictionary<char,int>> listOfPNObjects = new List<Dictionary<char,int>>();
listOfPNObjects.Add(new Dictionary<char,int>())    //create default P dictionary
foreach(entry in collection) {
    if(entry.Key == N)
    {
            listOfPNObjects.Add(new Dictionary<char,int>());
    }
    else
    {
          listOfPNObjects[listOfPNObjects.Count - 1].Add(entry.key, entry.value);
    }

}

关于c# - 根据条件和发生将集合拆分为对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18010775/

相关文章:

c# - 通用类型类型转换方法(.Net)

.net - Nunit 添加自定义属性

c++ - 静态分配数组的内存分配是否总是按地址值顺序排列?

python - NumPy 。如何将二维数组按网格分割为多个数组?

c# - 如何在没有布局问题的情况下在运行时更改语言

c# - 如何处理通用返回 T 的异常

c# - 序列化/反序列化数据集(作为备份我的数据的一种方式)

c# - 控件如何确定使用哪个 DataContext?

javascript - 来自偏移量编号的数组项索引

C# tcp 套接字如何判断正在发送的对象类型?