Frage

Wie finde ich und eine Eigenschaft ersetzen mithilfe von Linq in diesem speziellen Szenario unter:

public interface IPropertyBag { }
public class PropertyBag : IPropertyBag
{
    public Property[] Properties { get; set; }

    public Property this[string name]
    {
        get { return Properties.Where((e) => e.Name == name).Single(); }
        //TODO: Just copying values... Find out how to find the index and replace the value 
        set { Properties.Where((e) => e.Name == name).Single().Value = value.Value; }
    }
}

Danke für die Hilfe im Voraus aus.

War es hilfreich?

Lösung

Sie LINQ nicht verwenden, da es nicht den Code verbessern, weil LINQ konzipiert Sammlung abzufragen und nicht, sie zu ändern. Ich schlage vor, die folgenden.

// Just realized that Array.IndexOf() is a static method unlike
// List.IndexOf() that is an instance method.
Int32 index = Array.IndexOf(this.Properties, name);

if (index != -1)
{
   this.Properties[index] = value;
}
else
{
   throw new ArgumentOutOfRangeException();
}

Warum sind Array.Sort () und Array.indexOf () Methoden statisch?

Weitere schlage ich nicht ein Array zu verwenden. Betrachten Sie IDictionary<String, Property> verwenden. Dies vereinfacht den Code auf die folgenden.

this.Properties[name] = value;

Beachten Sie, dass weder Lösung ist die Threadsicherheit.


Eine Ad-hoc-LINQ-Lösung - Sie sehen, sollten Sie es nicht verwenden, da das gesamte Array wird durch einen neuen ersetzt werden,

.
this.Properties = Enumerable.Union(
   this.Properties.Where(p => p.Name != name),
   Enumerable.Repeat(value, 1)).
   ToArray();

Andere Tipps

[Anmerkung: Diese Antwort war wegen eines falschen Verständnis der Frage - die Kommentare zu dieser Antwort sehen. Offenbar bin ich ein wenig dichter :(] Ist Ihr ‚Property‘ eine Klasse oder eine Struktur?

Dieser Test geht für mich:

public class Property
{
    public string Name { get; set; }
    public string Value { get; set; }
}
public interface IPropertyBag { }
public class PropertyBag : IPropertyBag
{
    public Property[] Properties { get; set; }

    public Property this[string name]
    {
        get { return Properties.Where((e) => e.Name == name).Single(); }
        set { Properties.Where((e) => e.Name == name).Single().Value = value.Value; }
    }
}

[TestMethod]
public void TestMethod1()
{
    var pb = new PropertyBag() { Properties = new Property[] { new Property { Name = "X", Value = "Y" } } };
    Assert.AreEqual("Y", pb["X"].Value);
    pb["X"] = new Property { Name = "X", Value = "Z" };
    Assert.AreEqual("Z", pb["X"].Value);
}

Ich muß mich fragen, warum der Getter eine ‚Property‘ statt was Datentyp .Wert zurück, aber ich bin immer noch neugierig, warum Sie ein anderes Ergebnis ist zu sehen als das, was ich bin.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top