375 Stimmen

Wie lässt sich eine Liste von Tupeln einfach initialisieren?

Ich liebe Tupel . Sie ermöglichen es Ihnen, relevante Informationen schnell zu gruppieren, ohne eine Struktur oder Klasse dafür schreiben zu müssen. Dies ist sehr nützlich beim Refactoring von sehr lokalisiertem Code.

Die Initialisierung einer Liste von ihnen scheint jedoch etwas überflüssig zu sein.

var tupleList = new List<Tuple<int, string>>
{
    Tuple.Create( 1, "cow" ),
    Tuple.Create( 5, "chickens" ),
    Tuple.Create( 1, "airplane" )
};

Gibt es nicht einen besseren Weg? Ich würde gerne eine Lösung nach dem Vorbild der Wörterbuch-Initialisierer .

Dictionary<int, string> students = new Dictionary<int, string>()
{
    { 111, "bleh" },
    { 112, "bloeh" },
    { 113, "blah" }
};

Können wir nicht eine ähnliche Syntax verwenden?

4voto

djangojazz Punkte 13127

Super Duper Old ich weiß, aber ich würde meinen Teil auf die Verwendung von Linq und Fortsetzung Lambdas auf Methoden mit mit C# 7 hinzufügen. Ich versuche, benannte Tupel als Ersatz für DTOs und anonyme Projektionen zu verwenden, wenn sie in einer Klasse wiederverwendet werden. Ja, für Mocking und Testen brauchen Sie immer noch Klassen, aber Dinge inline zu tun und in einer Klasse weiterzugeben ist schön, diese neuere Option IMHO zu haben. Man kann sie instanziieren von

  1. Direkte Instanziierung
var items = new List<(int Id, string Name)> { (1, "Me"), (2, "You")};
  1. aus einer vorhandenen Auflistung, und jetzt können Sie gut typisierte Tupel zurückgeben, ähnlich wie anonyme Projektionen früher gemacht wurden.
public class Hold
{
    public int Id { get; set; }
    public string Name { get; set; }
}

//In some method or main console app:
var holds = new List<Hold> { new Hold { Id = 1, Name = "Me" }, new Hold { Id = 2, Name = "You" } };
var anonymousProjections = holds.Select(x => new { SomeNewId = x.Id, SomeNewName = x.Name });
var namedTuples = holds.Select(x => (TupleId: x.Id, TupleName: x.Name));
  1. Verwenden Sie die Tupel später mit Gruppierungsmethoden wieder, oder verwenden Sie eine Methode, um sie inline in anderer Logik zu konstruieren:
//Assuming holder class above making 'holds' object
public (int Id, string Name) ReturnNamedTuple(int id, string name) => (id, name);
public static List<(int Id, string Name)> ReturnNamedTuplesFromHolder(List<Hold> holds) => holds.Select(x => (x.Id, x.Name)).ToList();
public static void DoSomethingWithNamedTuplesInput(List<(int id, string name)> inputs) => inputs.ForEach(x => Console.WriteLine($"Doing work with {x.id} for {x.name}"));

var namedTuples2 = holds.Select(x => ReturnNamedTuple(x.Id, x.Name));
var namedTuples3 = ReturnNamedTuplesFromHolder(holds);
DoSomethingWithNamedTuplesInput(namedTuples.ToList());

1voto

Alex Dresko Punkte 4965

Eine Technik, die ich für etwas einfacher halte und die hier noch nicht erwähnt wurde:

var asdf = new [] { 
    (Age: 1, Name: "cow"), 
    (Age: 2, Name: "bird")
}.ToList();

Ich denke, das ist ein bisschen sauberer als:

var asdf = new List<Tuple<int, string>> { 
    (Age: 1, Name: "cow"), 
    (Age: 2, Name: "bird")
};

-6voto

Egi Messito Punkte 15
    var colors = new[]
    {
        new { value = Color.White, name = "White" },
        new { value = Color.Silver, name = "Silver" },
        new { value = Color.Gray, name = "Gray" },
        new { value = Color.Black, name = "Black" },
        new { value = Color.Red, name = "Red" },
        new { value = Color.Maroon, name = "Maroon" },
        new { value = Color.Yellow, name = "Yellow" },
        new { value = Color.Olive, name = "Olive" },
        new { value = Color.Lime, name = "Lime" },
        new { value = Color.Green, name = "Green" },
        new { value = Color.Aqua, name = "Aqua" },
        new { value = Color.Teal, name = "Teal" },
        new { value = Color.Blue, name = "Blue" },
        new { value = Color.Navy, name = "Navy" },
        new { value = Color.Pink, name = "Pink" },
        new { value = Color.Fuchsia, name = "Fuchsia" },
        new { value = Color.Purple, name = "Purple" }
    };
    foreach (var color in colors)
    {
        stackLayout.Children.Add(
            new Label
            {
                Text = color.name,
                TextColor = color.value,
            });
        FontSize = Device.GetNamedSize(NamedSize.Large, typeof(Label))
    }

this is a Tuple<Color, string>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X