konto usunięte

Temat: Linq: jak stworzyć pusty obiekt IGrouping

Chciałem za pomocą Linq wyciągnąć DOKŁADNIE JEDEN element z kolekcji i poddać go dalszej projekcji przez .Select (jest to akurat kolekcja obiektów IGrouping). Poniższy kod ma jeden feler:

(_enumerable.SingleOrDefault(i => i.Key == 'key')).Select(.....)

jeżeli SingleOrDefault zwróci null to dostanę null reference exception. Chodzi mi o ładne rozwiązanie tego problemu. Ja rozwiązałem to tak jak na poniższym kodzie - definiując pusty IGrouping - i mam mocne wrażenie, że da się to zrobić prościej i coś przeoczyłem w dokumentacji.

(_enumerable.SingleOrDefault(i => i.Key == 'key') ?? new EmptyGrouping<SomeClass>()).Select(.....)

internal sealed class EmptyGrouping<T> : IGrouping<int,T> where T : class {
internal EmptyGrouping() {}
int IGrouping<int,T>.Key { get { return 0; } }
IEnumerator<T> IEnumerable<T>.GetEnumerator() {
yield break;
}
IEnumerator IEnumerable.GetEnumerator() {
yield break;
}
}

konto usunięte

Temat: Linq: jak stworzyć pusty obiekt IGrouping

Jedyny prostszy sposób jaki mi przychodzi do głowy to coś czego prawdopodobnie starasz się uniknąć, czyli:

var foo = (_enumerable.SingleOrDefault(i => i.Key == 'key'));

if (foo == null)
{
return...
}

// code

Nie znam całego kontekstu (przypuszczam, że masz również inny powód do tworzenia EmptyGrouping). Jeżeli jednak tworzysz EmptyGrouping tylko po to żeby zadziałało "to" wyrażenie linq, to moim zdaniem to zbytnia komplikacja kodu.

j

konto usunięte

Temat: Linq: jak stworzyć pusty obiekt IGrouping

Jarek D.:
Jedyny prostszy sposób jaki mi przychodzi do głowy to coś
czego prawdopodobnie starasz się uniknąć, czyli:
Zgadza się, chcę wszystko załatwić jedną linijką czyli baaardzo długim query.
moim zdaniem to zbytnia komplikacja kodu.
to już kwestia gustu:) Ja chcę tylko dokonać transformacji czyli projekcji pewnego hierarchicznego obiektu (autogenerowanego przez svcutil) na mój własny DTO. Bardzo mi się nie spodobało pisanie proceduralnego kodu do zwykłej transformacji.

Następna dyskusja:

IUnityContainer - jak dokon...




Wyślij zaproszenie do