更改lambda / LINQ

时间:2016-08-31 23:37:00

标签: c# linq lambda

我有一个类似于

的对象列表的字典
class Client
    {
        public int Hash { get; set; }
        public bool Active { get; set; }
    }
    var ClientsDict = new Dictionary<string, List<Client>>();

我在列表中设置单个记录值没有问题

 ClientsDict[userId].First(a => a.Hash == hash).Active = true;

如何进行相反的操作并将列表中的所有其他内容设置为false?

 ClientsDict[userId].All().Active = false; //cannot resolve symbol

注意:我想避免使用foreach

编辑:

ClientsDict[userId].ForEach(a => a.Active = false); //this works

2 个答案:

答案 0 :(得分:4)

如果您正在改变事物,那么您不应该将其表达为LINQ转换。只需使用常规foreach循环:

foreach(var client in ClientsDict[userId])
{
    client.Active = false;
}

您也可以使用List<T>.ForEach method,但我会反对。

答案 1 :(得分:0)

使用Where LINQ方法表示相反的条件并循环结果集:

foreach(var client in ClientsDict[userId].Where(c => c.Hash != hash))
{
    client.Active = false;
}

编辑:用于比较的ForEach()方法版本:

ClientsDict[userId]
    .Where(c => c.Hash != hash)
    .ToList()
    .ForEach(c => c.Active = false);

我通常不喜欢使用ForEach()方法,但我不得不承认它在这里看起来并不太糟糕。也就是说,由于该方法仅适用于List<T>,因此您被迫致电.ToList()

关于它的使用是否是一个好主意的更哲学讨论,请参见此处:“foreach” vs “ForEach”