如何根据特定条件筛选列表中的元素,然后使用Linq更改它们的属性

本文关键字:Linq 属性 然后 特定条件 何根 筛选 列表 元素 | 更新日期: 2023-09-27 17:59:36

我有List,例如:

    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 + "/");

所以,我想要"FUser"的属性IsShow = true"FUser2""FUser3""FUser4"IsShow = false作为BUser

有林克,没有循环,这是可能的吗?

如何根据特定条件筛选列表中的元素,然后使用Linq更改它们的属性

List<T>'的ForEach方法(实际上不是Linq的一部分)怎么样:

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

请注意,Linq是关于查询数据,而不是修改它。(语言集成查询

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

有林克,没有循环,这是可能的吗?

这种问题经常被问到。你所说的"无循环"是指——不枚举集合。我认为Linq.Enumerable可以在不查看整个列表的情况下,以某种方式在您的列表中使用一个神奇生成的索引来查找您要查找的内容,这是一种祈祷。不幸的是,事实并非如此。Enumerable在列表中没有神奇的索引,它通过枚举列表来工作——就像你可能编写的foreach循环一样。

所以,这个问题的答案是"不"。

在创建列表时,您应该使用集合初始值设定项。另外,在此处设置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;
        }

您实际上可以使用以下代码更改源列表的对象:

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

当您使用foreach语句循环结果列表时,这将为您节省额外的"周期"。