簡體   English   中英

Linq 查詢字典,其中值不在列表中

[英]Linq Query Dictionary where value not in List

我有一個字典和另一個列表。 我想要實現的是LINQ查詢,以從字典中獲取所有項目,其中所述字典中的任何值都不在List<string>中。 我發現這篇文章很有幫助, Linq Query Dictionary where value in List 並且能夠寫出下面的 LINQ 表達式。

到目前為止我所擁有的:Data 是字典,PersonList 是字符串列表。

var Persons = Data.Where(kvp => !PersonList.Contains(kvp.Key))
                  .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);

但是,我的結果實際上從未返回任何內容。

更新:

Dictionary<string, string> Data = new Dictionary<string, string>
{
    { "John", "aaa" },
    { "Tom", "bbb" },
    { "David", "ccc" }
};

List<string> PersonList = new List<string>
{
    "Tom",
    "Peter"
};

var Persons = Data.Where(kvp => !PersonList.Contains(kvp.Key))
                  .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);

您是否有可能在這里打錯字並打算改寫這個?

// changed to kvp.Value from kvp.Key
var Persons = Data.Where(kvp => !PersonList.Contains(kvp.Value))
                  .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);

這會根據您的問題從列表中的字典中搜索值並保留那些不在列表中的條目。

contains可能不起作用,因為PersonList中的項目是字典中的鍵以外的其他對象。 對象可能相同(具有相同的內容),但如果它不同 object(不同的引用),則contains將返回 false。

一個例子:

myObject = new myObject() { Id = 1 };

List<myObject> listOfObjects = new List<myObject>();
listOfObjects.Add(new myObject() { Id = 1 });

var result = listOfObjects.Contains(myObject); // returns false, because the item in the list is a different object than myObject

result = listOfObjects.Any(obj => obj.Id == myObject.Id); // returns true

我不知道PersonList由什么組成,但是如果元素具有例如Id屬性,那么您可以執行以下操作:

var Persons = Data.Where(kvp => !PersonList.Any(person => person.Id == kvp.Key.Id))
              .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);

我自己回答這個問題,因為我一直在從錯誤的角度研究這個問題。 以下按預期工作:

Dictionary<string, string> Data = new Dictionary<string, string>
{
    { "John", "aaa" },
    { "Tom", "bbb" },
    { "David", "ccc" }
};

List<string> PersonList = new List<string>
{
    "Tom",
    "Peter"
};

List<string> PersonListNotInDictionary = PersonList.Where(pl => !Data.ContainsKey(pl))
                                                   .ToList();

您可以嘗試以下代碼段

var result = data.Where(d => PersonList.All(p => p != d.Value));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM