2015-12-31 4 views
6

У меня есть класс, который имеет свойство non-primitive.
Мне нужно обновить некоторое дочернее свойство этого свойства родительского класса.Обновить вложенное свойство Linq

public class Parent 
{ 
    public string Abc { get; set; } 
    public Childclass Pos { get; set; } 
} 

public class Childclass 
{ 
    public string Value { get; set; } 
} 

List<Parent> parents = new List<Parent>() 

Parent p1 = new Parent(); 
p1.Pos.Value = "1"; 
parents.Add(p1); 

Parent p2 = new Parent(); 
p2.Pos.Value = "2"; 
parents.Add(p2); 

Теперь мне нужно обновить Pos у родителей where Pos.Value == "2"?

+0

Но свойство 'Pos' не является' int', а 'Childclass'? –

+1

Вы имели в виду 'p1.Pos.Value =" 1 "'? –

+0

Да, Исправлено. – eyalb

ответ

3
List<Parent> parents = new List<Parent>(); 

Parent p1 = new Parent(); 
p1.Pos = new Childclass() { Value = "1" }; 
parents.Add(p1); 

Parent p2 = new Parent(); 
p2.Pos = new Childclass() { Value = "2" }; 
parents.Add(p2); 

Если вам необходимо обновить каждые пункты:

foreach (Parent parent in parents.Where(e => e.Pos.Value.Equals("2"))) 
    parent.Pos.Value = "new value"; 

Если вам необходимо обновить первый пункт только:

parents.FirstOrDefault(e => e.Pos.Value.Equals("2")).Pos.Value = "new value"; 
+0

, и если я знаю, что есть только один с Pos.Value == 2, мне нужно всегда все петли? – eyalb

+0

и если Pos - это список ? – eyalb

+0

«ToList» вызов в foreach, я считаю, посторонним; он перебирает все данные для создания списка, затем вы перебираете новый список. Оставив это, можно построить перечислимое, и поэтому оно в некотором смысле более ленивое. –

0

Вы можете отфильтровать значение с помощью Enumerable.FirstOrDefault, который будет получить первый элемент, соответствующий предикату:

var parent = parents.FirstOrDefault(
       x => x.Pos.Value.Equals("2", StringComparison.OrdinalIgnoreCase)); 
parent.Pos.Value = "3"; 

Если у вас есть много поисков, возможно, вы хотели бы использовать Dictionary<string, Parent> где ключ какой-то неизменяемое значение, которое не изменяется, если это возможно:

var keyToParent = new Dictionary<string, Parent> 
{ 
    ["Abc"] = p1, 
    ["Dfc"] = p2 
}; 

if (!keyToParent.ContainsKey("Abc")) 
    return; 

var retrievedParent = keyToParent["Abc"]; 
retrievedParent.Pos.Value = "3"; 
1

Я думаю, что вам нужно, как это:

parents.Where(l => l.Pos.Value.Equals("2")).ToList().ForEach(i => i.Post.Value="updateValue"); 
Смежные вопросы