Podana jest poniższa tablica (każdy blok [], oznacza wpis):podziału gromadzenia się obiektu w zależności od stanu i występowania
[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]
trzeba podzielić go do obiektów typu „N” (NObject) gdzie jak każdy inny znak reprezentuje określoną właściwość tego obiektu NObject do następnego wystąpienia "N". Do pierwszego wystąpienia "N" znaki należą do innego obiektu (nazwijmy to PObject). Więc zadania powinny spełniać follwing:
- mapie każdy znak do nieruchomości PObject
- Po pierwsze occurrs „n”, utwórz nowy NObject
- mapie każdy znak do właściwości tego NObject
- Jeśli wystąpi kolejna postać N utwórz nowy NObject
Obecnie w Pseudokod moje rozwiązanie wygląda następująco co uważam jest dalekie od ideału.
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();
....
....
}
}
Który daje mi dokładnie to, co chcę:
[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
Ale z ponad 30 możliwych identyfikatorów własności (co oznacza 30 warunki switch) oraz własności przypisany wyłącznie na podstawie faktu, że nobject może być null (i tworzenie nowego każdego wystąpienia "N" char): Kod jest niesamowicie śmierdzący. Ale nie wiem, jak to zrobić inaczej, może z wbudowanymi funkcjami kolekcji, LINQ lub czymkolwiek innym.
Odbicie usunęłoby komunikat z przełącznika, ale nie jestem pewien, czy przeczytałem twoje pytanie na tyle dobrze, aby zrozumieć, że jest ci przykro. – Sayse
Możesz użyć biblioteki gravell [FastMember] (https://code.google.com/p/fast-member/), aby uzyskać dostęp do elementów obiektu według ich nazwy ("A", "B", ...) – xanatos
Czy celowe jest dodawanie do właściwości zamiast ich ustawiania? (nobject ?? (CommonBase) pobject) .H + = entry.Value; zamiast (nobject ?? (CommonBase) pobject) .H = entry.Value; – ne2dmar