2009-04-14 40 views
4

如何查找,並在下面這種特定情況下替換使用LINQ屬性替換集合項目:使用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; } 
    } 
} 

感謝提前幫忙。

+0

你使用了什麼PropertyBag?我不認爲在.Net BCL中有一個。我問,因爲'屬性'getter可能是做克隆的人,所以你不能做你想做的事情。 – 2009-04-14 23:49:51

+0

Jonathan,這是我自己定製的PropertyB ag類..上面的代碼工作,因爲我沒有替換Property []數組中的整個項目。代碼中的註釋說明: // TODO:只是複製值...瞭解如何找到索引並替換值 – 2009-04-14 23:55:37

+0

只是想知道爲什麼你沒有使用我的LINQ-free IndexOf()解決方案...現在我知道!我將實例的答案更正爲靜態方法。 – 2009-04-16 11:54:11

回答

6

不要使用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(); 
} 

Why are Array.Sort() and Array.IndexOf() methods static?

另外我建議不要使用數組。考慮使用IDictionary<String, Property>。這簡化了以下代碼。

this.Properties[name] = value; 

請注意,這兩種解決方案都不是線程安全的。


一個特設LINQ的解決方案 - 你看,你不應該使用它,因爲整個陣列將用一個新的來代替。

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

[注意:此答案是由於對該問題的誤解 - 請參閱對此答案的評論。很顯然,我有點密集:(] 是您的「財產」類或結構

該測試通過對我來說:?

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,但我仍然好奇你爲什麼看到與我不同的結果。