konto usunięte

Temat: Funkcjonalna projekcja zbioru int? w zbiór int

using System.Diagnostics;
using System.Linq;
static class Program {
static void Main(string[] args) {
int?[] source = new int?[] { 1,null,3,null,4 };
int[] result = new int[0];//TODO
Debug.Assert(result.SequenceEqual(new int[] { 1,3,4 }),"zla odpowiedz:)");
}
}

Taka prosta zagadka - jak fajnie-funkcjonalnie tj. w jednej linijce odsiać ze zbioru source wartości null? Oczywiście mam swoją odpowiedź, ale chciałem poznać sposób podejścia innych do problemu operacji na zbiorach (pomińmy w rozważaniach fakt uporządkowania elementów - zapis z int[] jest czytelniejszy niż HashSet<int>)

konto usunięte

Temat: Funkcjonalna projekcja zbioru int? w zbiór int

Hmm...tak na szybko.


int[] result = source.Except(new int?[] {null}).Select(x=>x.Value).ToArray();

konto usunięte

Temat: Funkcjonalna projekcja zbioru int? w zbiór int


int[] result = source.Where(x => x.HasValue).Select(x => x.Value).ToArray();

konto usunięte

Temat: Funkcjonalna projekcja zbioru int? w zbiór int

result = source.OfType<int>().ToArray();

Wolniejsze od rozwiązania Karima.

konto usunięte

Temat: Funkcjonalna projekcja zbioru int? w zbiór int

Dzięki za ciekawe podpowiedzi.
Chciałem połączyć filtrowanie(selekcję) z projekcją w jednym i dlatego modyfikując lekko przykład oto moja propozycja:
int[] source = new int[] { 1,2,3,4,5,6,7,8,9 };
float[] result = source.SelectMany(x => (x % 3 == 0) ? new float[] { x } : new float[0]).ToArray();
Debug.Assert(result.SequenceEqual(new float[] { 3f,6f,9f }),"zla odpowiedz:)");

Doszedłem do tego przy okazji poznawania F#, w którym raz, że jest funkcja Seq.choose która łączy w sobie selekcję i projekcję w jednym ale prócz tego sam F# pozwala na stosowanie yield w lambdach, co moim zdaniem podnosi czytelność kodu, bo widząc taką lambdę:
if(x%3 == 0) yield return (float)x;
od razu widać o co chodzi.
Ogólnie do operacji na kolekcjach (IEnumerable) C# z Linq sobie jeszcze radzi, ale F# rozkręca się dopiero przy computation expressions :)



Wyślij zaproszenie do