Dato è la seguente matrice (ogni blocco [] rappresenta una voce):raccolta Split in oggetti basato su condizioni e occorrenza
[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]
devo dividerlo in oggetti di tipo 'N' (NObject) dove ogni altro personaggio rappresenta una proprietà specifica di quell'oggetto NObject fino alla successiva occorrenza di "N". Fino alla prima occorrenza di "N", i personaggi appartengono a un altro oggetto (chiamiamolo PObject). Quindi, i compiti devono soddisfare il follwing:
- mappa ogni personaggio a una proprietà pObject
- Quando i primi occurrs 'N', creare un nuovo NObject
- Mappa ogni personaggio a una proprietà di quel NObject
- Se si verifica un altro carattere N, creare un nuovo oggetto NO
Attualmente, in pseudocodice la mia soluzione sembra la seguente che trovo è tutt'altro che ideale.
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();
....
....
}
}
che mi dà esattamente quello che voglio:
[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
Ma con oltre 30 possibili identificatori di proprietà (il che significa 30 condizioni di commutazione) e una proprietà assegnato solo in base al fatto che nOggetto può essere nullo (e creandone uno nuovo ogni occorrenza di "N"): il codice è incredibilmente maleodorante. Ma non so come farlo in modo diverso, magari con funzioni di raccolta integrate, LINQ o qualsiasi altra cosa.
Reflection rimuoverà l'istruzione switch, ma non sono sicuro di aver letto la tua domanda abbastanza bene da comprendere il tuo requisito mi dispiace. – Sayse
Puoi utilizzare la libreria [FastMember] (https://code.google.com/p/fast-member/) del gravell per accedere agli elementi dell'oggetto con il loro nome ('A', 'B', ...) – xanatos
è intenzionale che si aggiungono alle proprietà invece di impostarle? (nobject ?? (CommonBase) pobject) .H + = entry.Value; invece di (nobject ?? (CommonBase) pobject) .H = entry.Value; – ne2dmar