2013-02-14 5 views
0

У меня есть List, например:Как фильтровать элементы в списке по определенным критериям, а затем изменять их свойства с помощью Linq?

public class User 
     {  
      public string Name { get; set;} 
      public bool IsShow { get; set;} 
     } 

    List<User> myList = new List<User>(); 
    myList.Add(new User(){Name = "FUser", IsShow = true}); 
    myList.Add(new User(){Name = "FUser2", IsShow = true}); 
    myList.Add(new User(){Name = "FUser3", IsShow = true}); 
    myList.Add(new User(){Name = "BUser", IsShow = true}); 
    myList.Add(new User(){Name = "FUser4", IsShow = true}); 

Как я могу отфильтровать элементы списка по определенным критериям, а затем изменить их свойства с Linq?

Я фильтровать элементы:

myList.AsEnumerable().Where(u => u.Name.Contains("/" + F + "/"); 

Итак, я хочу свойство IsShow = true для "FUser", "FUser2", "FUser3", "FUser4" и IsShow = false для BUser.

Возможно ли с Linq без цикла?

+0

Что именно означает * без цикла *? – sloth

+0

Я имею в виду без цикла в коде, я могу выбрать необходимые элементы с Linq, а затем в цикле foreach() определить свойства, но я хотел Linq сделать это. – Alexandr

ответ

2
void Main() 
{ 
    List<User> myList = new List<User>(); 
    myList.Add(new User(){Name = "FUser", IsShow = true}); 
    myList.Add(new User(){Name = "FUser2", IsShow = true}); 
    myList.Add(new User(){Name = "FUser3", IsShow = true}); 
    myList.Add(new User(){Name = "BUser", IsShow = true}); 
    myList.Add(new User(){Name = "FUser4", IsShow = true}); 

    // the magic happens here 
    var results = myList.Select(p=> new User { Name = p.Name, IsShow=p.Name.First()=='F'}); 
} 
    public class User 
     {  
      public string Name { get; set;} 
      public bool IsShow { get; set;} 
     } 

// Define other methods and classes here 
1

Возможно ли с Linq без цикла?

Этот вопрос задается очень часто. То, что вы подразумеваете под «без цикла», - это без перечисления коллекции. Я думаю, что это молитва, что Linq.Enumerable может каким-то образом использовать волшебный сгенерированный индекс в ваш список, чтобы найти то, что вы ищете, не глядя на весь список. К сожалению, это не случай. Linq.Enumerable не имеет магических индексов в вашем списке, он работает, перечисляя список - то же самое, что и цикл foreach, который вы можете написать.

Итак - ответ на вопрос «Нет».

+0

Спасибо за ответ! Я знаю, что Linq использует цикл, но я хотел, чтобы Linq сделал это прозрачно для меня. Я понимаю тебя, спасибо. – Alexandr

3

Как насчет List<T>' сек метода ForEach (который не является фактически частью Linq):

myList.ForEach(u => { u.IsShow = u.Name.Contains("..."); }); 

Обратите внимание, что Linq составляет около запросов данных, не изменяя его. (Language Integrated Query )

+0

Обратите внимание, что вы просто можете использовать '(u => u.IsShow = u.Name.Contains (" ..."))' – sloth

+0

Право, обновил мой ответ –

+0

Спасибо, это цикл, но это решение очень подходит для меня, я просто хотел уменьшить количество кода. – Alexandr

1

Ну вне ваш вопрос, когда вы создаете свой список, вы должны использовать коллекции инициализатор. Также установите здесь Ienumerable.

IEnumerable<User> myList = new List<User> 
     { 
     new User() {Name = "FUser", IsShow = true}, 
     new User() {Name = "FUser2", IsShow = true}, 
     new User() {Name = "FUser3", IsShow = true}, 
     new User() {Name = "BUser", IsShow = true}, 
     new User() {Name = "FUser4", IsShow = true} 
     }; 

Тогда делать то, что вы спрашиваете, вы должны сделать:

string parameter = "F"; 
foreach (var s in myList.Where(s => s.Name.Contains == parameter)) 
     { 
      s.IsShow = true; 
     } 

или

string parameter = "BUser"; 
foreach (var s in myList.Where(s => s.Name == parameter)) 
     { 
      s.IsShow = false; 
     } 
1

Вы действительно можете изменить объект в списке источников, используя следующий код:

List<User> myList = new List<User>(); 
myList.Add(new User() { Name = "FUser", IsShow = true }); 
myList.Add(new User() { Name = "FUser2", IsShow = true }); 
myList.Add(new User() { Name = "FUser3", IsShow = true }); 
myList.Add(new User() { Name = "BUser", IsShow = true }); 
myList.Add(new User() { Name = "FUser4", IsShow = true }); 

myList 
    .Where(user => user.Name.StartsWith("F")) 
    .Select(user => 
    { 
     user.IsShow = true; 
     return user; 
    }); 

Это экономит вам дополнительные «циклы», когда вы зацикливаете результирующий список, используя statemtent foreach.

Смежные вопросы