3 Stimmen

Wie ändere ich ein Feld in einer Sammlung von Objekten, die ich in

Ich versuche, Folgendes zu tun... (Foo ist eine Klasse)

void Main() 
{
    var foos = ...
    DoSomeWork(foos);
    // I want all foos to have Bar set to 42
}

public static void DoSomeWork(IEnumberable<Foo> foos) 
{
    foreach (var foo in foos)
    {
        foo.Bar = 42;
    }
}

class Foo 
{
    String blahblah;
    Int32 Bar;
}

Aber alle Foos haben ihre ursprünglichen Werte. Wie ändere ich sie bei einem Ref-Parameter?

3voto

Yuriy Rozhovetskiy Punkte 21846

Da Sie die Ausführung von LINQ-Abfragen nicht mit Methoden wie ToList o ToArray Jedes Mal, wenn Sie die Abfrage aufzählen, wird sie von neuem ausgeführt. Sie müssen die Abfrageergebnisse mit dem Cache ToList Methode und übergeben diese Liste dann an die DoSomeWork Methode.

2voto

leppie Punkte 111830

Es könnte sein, dass foos ist eine erzeugende IEnumerable . Beispiel:

IEnumerable<Foo> GetFoos()
{
  yield return new Foo {};
  yield return new Foo {};
  yield return new Foo {};
}

var foos = GetFoos();

Sie können die erzeugten Werte niemals ändern, da sie bei jeder Iteration neu erstellt werden foos .

Wenn Sie nun, wie von @YuriyRozhovetskiy vorgeschlagen, folgendes tun, wird es funktionieren.

var foos = GetFoos().ToList();

Jetzt können wir fröhlich mutieren :)

0voto

mco Punkte 159

Das ist seltsam, es sollte für den Referenztyp (Klasse) funktionieren, aber für den Werttyp (Struktur) würde es nicht kompiliert.

Zunächst einmal brauchen Sie ref IEnumerable nicht an DoSomeWork zu übergeben, da Sie das Sammlungsobjekt nicht ändern wollen, sondern nur die Elemente darin.

Ich habe versucht, Ihren Fall zu reproduzieren, aber es funktioniert gut, Code unten. Könnten Sie einige weitere Details geben?

  • Welche Sammlung übergeben Sie (Liste, Set)?
  • Wenn Bar Eigentum ist - wie wird es umgesetzt?
  • Ist Foo ein Referenztyp (Klasse)?

Arbeitscode:

class Foo
{
    public Foo(int bar, int baz)
    {
        Bar = bar;
        Baz = baz;
    }
    public int Bar { get; set; }
    public int Baz;
}

class Program
{
    static void Main(string[] args)
    {
        var foos = new List<Foo>(new[]
        {
            new Foo(1, 2),
            new Foo(3, 4),
            new Foo(5, 6)
        });
        DoSomeWork(foos);
    }

    private static void DoSomeWork(IEnumerable<Foo> foos)
    {
        foreach (var foo in foos)
        {
            foo.Bar = 42;
            foo.Baz = 42;
        }
    }
}

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