use*_*817 6 .net c# linq arrays object
给定是以下数组(每个块[]代表一个条目):
[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]
Run Code Online (Sandbox Code Playgroud)
我需要将它分成'N'类型的对象(NObject),其中每个其他字符代表该NObject对象的特定属性,直到下一次出现'N'.直到第一次出现'N',字符属于另一个对象(让我们称之为PObject).所以任务应该完成以下任务:
目前,在伪代码中我的解决方案看起来如下,我发现它远非理想.
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();
....
....
}
}
Run Code Online (Sandbox Code Playgroud)
这给了我我想要的东西:
[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
Run Code Online (Sandbox Code Playgroud)
但是有超过30个可能的属性标识符(这意味着30个切换条件)和仅基于nobject可能为空的事实分配的属性(并且每个'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);
}
}
Run Code Online (Sandbox Code Playgroud)