Vra

Hoe kry ek en 'n eiendom met behulp van Linq in hierdie spesifieke scenario hieronder vervang:

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; }
    }
}

Dankie vir uit help in advance.

Was dit nuttig?

Oplossing

Moet LINQ nie gebruik omdat dit die kode nie sal verbeter as gevolg LINQ is ontwerp by versameling navraag en nie om hulle te verander. Ek stel voor die volgende.

// 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();
}

Hoekom is Array.Sort () en Array.IndexOf () metodes statiese?

Verder stel ek voor 'n skikking te gebruik nie. Oorweeg die gebruik van IDictionary<String, Property>. Dit vergemaklik die kode om die volgende.

this.Properties[name] = value;

Let daarop dat nie oplossing is ryg veilig.


'n ad hoc LINQ oplossing - jy sien, jy moet dit nie gebruik nie, want die hele reeks sal vervang word met 'n nuwe een

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

Ander wenke

[Nota: Hierdie antwoord was as gevolg van 'n misverstand van die vraag - sien die kommentaar op hierdie antwoord. Blykbaar, ek is 'n bietjie dig :(] Is jou 'eiendom 'n klas of 'n struct?

Hierdie toets gaan vir my:

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);
}

Ek moet wonder hoekom die lucky n "Eiendom" in plaas van net die data type .Value terug, maar ek is nog steeds nuuskierig waarom jy sien 'n ander resultaat as wat ek is.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top