Question

Comment puis-je trouver et remplacer une propriété à l'aide Linq dans ce scénario spécifique ci-dessous:

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

Merci de nous aider à l'avance.

Était-ce utile?

La solution

Ne pas utiliser LINQ, car il ne va pas améliorer le code, car LINQ est conçu pour interroger la collecte et de ne pas les modifier. Je suggère ce qui suit.

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

Pourquoi Array.Sort () et Array.indexOf () Les méthodes statiques?

En outre, je suggère de ne pas utiliser un tableau. Pensez à utiliser IDictionary<String, Property>. Cela simplifie le code à ce qui suit.

this.Properties[name] = value;

Notez que ni la solution est thread-safe.


Une solution LINQ ad hoc - vous voyez, vous ne devriez pas l'utiliser parce que tout le tableau sera remplacé par un nouveau

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

Autres conseils

[Note: cette réponse était due à une mauvaise compréhension de la question - voir les commentaires sur cette réponse. Apparemment, je suis un peu dense :(] Est votre « propriété » d'une classe ou un struct?

Ce test passe pour moi:

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

Je me demande pourquoi le getter retourne une « propriété » au lieu de tout type de données .Value, mais je suis toujours curieux de savoir pourquoi vous voyez un résultat différent de ce que je suis.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top