LINQのを使用してコレクションアイテムを交換してください
-
09-09-2019 - |
質問
どのように私は以下のこの特定のシナリオで見つけて、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のの「プロパティ」を返す理由を疑問に持っているが、あなたは私が何よりも異なる結果を見ている、なぜ私はまだ興味があります。
所属していません StackOverflow