2016-08-31 48 views
0

我有對象的列表,看起來像這樣更改所有值一個lambda/LINQ

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 
+0

爲什麼你想避免foreach? – ILMTitan

+0

語義。批量編輯應該與單個編輯一樣緊湊簡潔。 – LastTribunal

回答

4

如果你正在變異的東西,你不應該表達它的LINQ改造。只需使用一個普通foreach循環:

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

您還可以使用List<T>.ForEach method,但我會建議反對。

+0

爲什麼你會反對呢?你怎麼用.foreach寫這個? – LastTribunal

+0

如果您可以回答我的問題的第一部分,我會接受您的答案,我已經回答了第二部分 – LastTribunal

+0

@LastTribunal您的問題的答案在答案的第一句中。不要將狀態變異模型化爲要評估的表達式,請顯式使用循環語句來顯示狀態正在被修改。 –

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」

+0

看到我的編輯 – LastTribunal

+0

是啊,看起來不錯。我只是想你想更新除了一個之外的所有客戶端。這就是我的理解:*我怎麼做__inverse__,並將列表中的所有__others__設置爲false?* – sstan

+0

你是對的,我的問題不明確 – LastTribunal

相關問題