0

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

所以,我想要, ,和的属性IsShow = true"FUser""FUser2""FUser3""FUser4"IsShow = falseBUser

没有循环,Linq 可以吗?

4

5 回答 5

3

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

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

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

于 2013-02-14T13:49:39.783 回答
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
于 2013-02-14T13:54:06.633 回答
1

没有循环,Linq 可以吗?

这种问题被问了很多。“没有循环”的意思是 - 没有枚举集合。我认为 Linq.Enumerable 可以以某种方式在您的列表中使用神奇生成的索引来查找您正在寻找的内容,而无需查看整个列表,这是一个祈祷。不幸的是,这种情况并非如此。Linq.Enumerable 在您的列表中没有神奇的索引,它通过枚举列表来工作 - 与您可能编写的 foreach 循环相同。

所以 - 问题的答案是“不”。

于 2013-02-14T13:49:36.430 回答
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;
        }
于 2013-02-14T14:04:16.903 回答
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; 
    });

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

于 2013-02-14T14:53:36.990 回答