Chwale się dodałem pierwszy nugetPackage! Nazywa się LinqForTuples i pozwala grupować zmiennie zapomocą System.ValueTuples, i traktować je "Enumerable<T>". Wygenerowałem wszystkie rozszerzenia z System.Linq w wersji tuplowej. Efekt połączenia ich składni tuple i linq wygląda tak:
https://github.com/scInvest/LinqForTuples
//To działajacy kod w C#
var min = (1,2,4,5).Min();
var max = (1,2,4,5).Max();
//szybkie tworzenie tablic i innych kolekcji
var list = ("a", "b" , "c").ToList();
string[] ComboBoxOptions => ("Yes", "No", "Unknown").ToArray()
//wielokrotne sprawdzenia bez duplikacji
void Contains(User user)
{
return (NormalUsers, AdminUsers, BannedUser).Any(x => x.Contains(user));
}
//lub
if((x1 ,x2, y1, y2).All(pos => pos > 0))
//swipowanie zmiennych "od tak"
(x1,x2) = (x1,x2).Swipe(x1 > x2);
//wywołanie funkcji na wielu zmiennych
void DeleteAccount(User user)
{
(NormalUsers, AdminUsers, BannedUser).Apply(x => x.Remove(user));
}
//łaczenie pojedyczych zmiennych i ich kolekcji "Od tak"
int[] array = (1,2,4).ToArray();
int[] array2 = (4,5,6).ToArray();
var fiveOrMore = (10, 3, 12, array, array2).Many().Where(x => x > 5);
//stara składania dlatego samego zadania
var fiveOrMore = (new int[] { 10, 3, 12 }).Concat(array).Concat(array2).Where(x => x > 5);
I wiele wiele innych. Jeśli komuś się to podoba lub może przydać, to proszę o łapkę w górę.
Od odpowiadając Ci na pytania:
Skąd pomysł?
W firmie które pracuję piszemy soft graficzny. W teamie do którego mnie przenieśli zaskakująco wielu ludzi nie radzi sobie z relacjami "from-to", "begin-end". i duplikuje kod w paskudny sposób. Wiec pomysł z rodził się z potrzeby jednolinijkowego obrabiania/swipowania par danych. Napisanie stosownego kodu, wymagałoby tak wiele wysiłku, że szybciej było napisać generator, a mając generator można wygenerować wszystkie funkcje.
No fajne, ale jakie to ma zastosowanie?
Podzielę odpowiedz na 3 części
Syntatic sugar
dla przykładu C# ma aż dwa mechanizmy tworzenia kolekcji ze zmiennych w locie. Pierwszy to params
pozwalający przekazywać zmiennie jedna po drugiej, drugi to new Collection(){ zmienna1, zmienna2} - wywołujące metodę Add. To co ten pakiet robi, to de facto, pozwala uzywać podejścia, "Params like" dla dowolnej metody z IEnumerable<T>. Oraz tworzyć kolecje w locie. czyli łączy oba podejścia w jedno.Podobnie jest z łączeniem enumercji i pojedynczych zmiennych., w o wiele prostszy sposób(ostatni przykład w poście wyżej). czy redukcja "duplikujących się warunków w if’ach" które normalna składnia nie bardzo pozwala uprościć czytelnie i racjonalnym wysiłkiem czasu.
np zamiast if ( x1 > 0 && x2 > 0 && y1 .> 0 && y2 > 0)
można if((x1 ,x2, y1, y2).All(pos => pos > 0))
albo jeszcze lepiej if((x1 , x2 ,y1 ,y2).All(GreaterThenZero))
Ostatni przykład w linii jest tak maksymalnie deklaratywny, jak tylko się da. "Sztuczny" nakład ze strony języka redukuję sie do nawiasów i kropek.
lub (a,b,c).ToArray() też jest do granic możliwości deklaratywna, gdzie cały nakład ze strony jezyka to kropki i nawiasy.
Albo if( (arg1, arg2, arg3).AnyIsNull()) // nie pamiętam czy to publikowałem
, albo if( (arg1?.Property1, arg1?.Property2, arg1?.Property3).Any(x => x != null && arg1?.Property1 == expectedValue))
zamiast warunku na cały monitor.
Nie oszukujmy się ale każdemu się kiedyś odechciało sprawdzić nulle bo to za dużo roboty. BTW "bo to za dużo roboty" jest główną przyczyną dla której dodano do jezyka .?
które pozwala sprawdzić nulle niskim nakładem pracy i niskim kosztem dla czytelności(to nie moja opinia, tylko oficjalny statment, gościa który podejmował decyzje :P).
Wiec podsumowując pozwala na bardziej deklaratywny kod, mniejszym nakładem kliknięć i zachowując większą czytelność. Przynajmniej dla przypadków leżących w pewnej niszy.
Nie znam się na programach graficznych ani nie wiem, co to relacje begin-end i from-to, więc odniosę się do tego, co zrozumiałem. :)
No ok, z Twoją biblioteką ifa można uprościć do: if((x1 ,x2, y1, y2).All(pos => pos > 0))
. Ale bez niej będzie wyglądał tak: new[] { x1, x2, y1, y2 }.All(pos => pos > 0)
. To naprawdę niewiele znaków więcej, a przynajmniej dla każdego oczywiste. Ok, Twój kod wygląda nieco ładniej, ale sam nie wiem, czy wprowadzenie dodatkowej zależności do projektu jest tego warte. W moim przypadku prawdopodobnie nie, za mało mam takich operacji.
No fajne, ale jakie to ma zastosowanie? Skąd pomysł?