Aktualizacja: W języku C# 7 można łatwo przypisać wiele zmiennych na raz za pomocą krotki. Aby przypisać elementy tablicy do zmiennych, należy napisać odpowiednią metodę rozszerzenia Deconstruct()
:
Innym sposobem na wykorzystanie krotek jest ich dekonstrukcja. Dekonstrukcji deklaracja jest składnia do dzielenia krotki (lub inną wartość) do jego części i przypisanie tych części indywidualnie do świeżych zmiennych:
(string first, string middle, string last) = LookupName(id1); // deconstructing declaration
WriteLine($"found {first} {last}.");
W deklaracji dekonstrukcji można użyć var dla poszczególnych zmiennych zadeklarowanych :
(var first, var middle, var last) = LookupName(id1); // var inside
Albo nawet umieścić pojedynczy var poza nawias jako skrót:
var (first, middle, last) = LookupName(id1); // var outside
Można także dekonstrukcji w istniejących zmiennych z dekonstrukcji przypisania:
(first, middle, last) = LookupName(id2); // deconstructing assignment
Dekonstrukcja nie jest tylko dla krotki. Każdy typ może zostać rozebrany, ile ma rozszerzenie (wystąpienie lub) metoda Deconstructora z postać:
public void Deconstruct(out T1 x1, ..., out Tn xn) { ... }
Out parametry stanowią wartości, które wynikają z rozbiórki.
(Dlaczego używa parametrów zamiast zwracania krotki? To jest , dzięki czemu można mieć wiele przeciążeń dla różnych liczb wartości ).
class Point
{
public int X { get; }
public int Y { get; }
public Point(int x, int y) { X = x; Y = y; }
public void Deconstruct(out int x, out int y) { x = X; y = Y; }
}
(var myX, var myY) = GetPoint(); // calls Deconstruct(out myX, out myY);
To będzie wspólny wzorzec mieć konstruktorzy i deconstructors być „symetryczny” w ten sposób. https://blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in-csharp-7-0/
Old odpowiedź:
W rzeczywistości, można uzyskać podobną funkcjonalność w C# za pomocą metody rozszerzenie tak (uwaga: nie obejmować sprawdzenie, czy argumenty są ważne) :
public static void Match<T>(this IList<T> collection, Action<T,T> block)
{
block(collection[0], collection[1]);
}
public static void Match<T>(this IList<T> collection, Action<T,T,T> block)
{
block(collection[0], collection[1], collection[2]);
}
//...
I można ich używać tak:
new[] { "hey", "now" }.Match((str1, str2) =>
{
Console.WriteLine(str1);
Console.WriteLine(str2);
});
W przypadku potrzebna jest wartość zwracana z funkcji, co następuje przeciążenie będzie działać:
public static R Match<T,R>(this IList<T> collection, Func<T, T, R> block)
{
return block(collection[0], collection[1]);
}
private string NewMethod1()
{
return new[] { "hey", "now" }.Match((str1, str2) =>
{
return str1 + str2;
});
}
w następujący sposób:
uniknąć konieczności powtarzania nazwę tablicy jak w roztworze zaproponowany przez JaredPar i innych; lista "zmiennych" jest łatwa do odczytania.
Unikasz konieczności jawnego zadeklarowania typów zmiennych, jak w rozwiązaniu Daniela Earwickera.
Wadą jest to, że kończy się dodatkowy blok kodu, ale myślę, że warto. Możesz użyć fragmentów kodu, aby uniknąć ręcznego wpisywania nawiasów klamrowych itp.
Wiem, że jest to 7-letnie pytanie, ale nie tak dawno temu potrzebowałem takiego rozwiązania - łatwe nadawanie nazw elementom tablicy przekazanym do metody (nie, używanie klas/struktur zamiast tablic było niepraktyczne, bo dla samych tablic mogę potrzebować różne nazwy elementu w różnych metod) i niestety skończyło się z kodem tak:
var A = points[0];
var A2 = points[1];
var B = points[2];
var C2 = points[3];
var C = points[4];
teraz mogę napisać (w rzeczywistości, mam refactored jedną z tych metod już teraz!):
points.Match((A, A2, B, C2, C) => {...});
Moje rozwiązanie jest podobne do dopasowywania wzorców w F # i I był inspirowany tej odpowiedzi: https://stackoverflow.com/a/2321922/6659843
Wow, brzydki i zagmatwany. Przypomina mi o mojej ostatniej randce. – Will
@Will: Naprawdę? Uważam, że jest ładny i zwięzły, a jednocześnie czytelny i czytelny. Raczej podoba mi się funkcja w Pythonie i często go używam. – Randolpho
Z perspektywy C#, zdecydowanie. Wygląda na to, że przypisujesz odwołanie do pojedynczej tablicy do dwóch różnych zmiennych ... jak str1 = nowy ciąg [] {"jeden", "dwa"}; str2 = str1; Jest to natychmiast mylące dla programistów C#. Ten brzydki kawałek był taki, że mogłem zmieścić się w żartach. – Will