Заменить элемент коллекции с помощью Linq - PullRequest
4 голосов
/ 15 апреля 2009

Как найти и заменить свойство с помощью Linq в этом конкретном сценарии ниже:

</p> <pre><code>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; } } }

Спасибо за помощь заранее.

Ответы [ 2 ]

6 голосов
/ 15 апреля 2009

Не используйте 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();
0 голосов
/ 15 апреля 2009

[примечание: этот ответ возник из-за неправильного понимания вопроса - см. Комментарии к этому ответу. Видимо, я немного дремучий :(] Ваше «Свойство» - это класс или структура?

Этот тест проходит для меня:

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

Я должен задаться вопросом, почему получатель возвращает «Свойство» вместо какого-либо типа данных. Значение, но мне все еще любопытно, почему вы видите другой результат, чем я.

...