4

如何在以下特定场景中使用 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; }
    }
}

感谢您提前提供帮助。

4

2 回答 2

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

为什么 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();
于 2009-04-14T23:55:58.523 回答
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);
}

I have to wonder why the getter returns a 'Property' instead of whatever datatype .Value, but I'm still curious why you're seeing a different result than what I am.

于 2009-04-15T00:23:32.717 回答