質問

どのように私は以下のこの特定のシナリオで見つけて、LINQのを使用してプロパティを交換します

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

事前に支援してくれることに感謝します。

役に立ちましたか?

解決

LINQがコレクションを照会するように設計されており、それらを修正していないので、それがコードを改善されませんので、LINQを使用しないでください。私は次のことをお勧めします。

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

なぜのArray.sort()とArray.IndexOf (静的)メソッドには

また、私は、配列を使用しないようお勧めします。 IDictionary<String, Property>を使用することを検討してください。これは、次のようにコードを簡素化します。

this.Properties[name] = value;

どちらのソリューションは、スレッドセーフであることに注意してください。

<時間>

アドホックLINQソリューション - あなたが見る、全体の配列は新しいものに置き換えられますので、

あなたがそれを使用しないでください。
this.Properties = Enumerable.Union(
   this.Properties.Where(p => p.Name != name),
   Enumerable.Repeat(value, 1)).
   ToArray();

他のヒント

[注:この答えは質問の誤解によるものであった - この答えにコメントを参照してください。どうやら、私は] :(少し密なんです あなたの「プロパティ」クラスまたは構造体はありますか?

このテストは私のために渡します:

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

私はゲッターではなく、どんなデータ型.Valueのの「プロパティ」を返す理由を疑問に持っているが、あなたは私が何よりも異なる結果を見ている、なぜ私はまだ興味があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top