簡體   English   中英

C# LINQ 從數組/列表中不包含值的位置選擇

[英]C# LINQ select from where value is not contained in array / list

LINQ 新手,不確定我想要做什么的正確語法。

我有一個“阻止列表”,一個數組或列表(可能是其中之一)我不想放入我正在制作的這個新“密鑰”列表中的錯誤代碼

目前...

var keys = (from s in context.Keys
            where s.Code != "BadCode1"
            where s.Code != "BadCode2"
            where s.Code != "BadCode3"
            where s.Code != "BadCode4"
            where s.Code != "BadCode5"
            orderby s.Name
            select s).ToList<Keys>();

我如何將其修剪為一行並從“阻止列表”中讀取? 所以更像……

var keys = (from s in context.Keys
            where s.Code != ANY OF THE VALUES FROM "BLOCKLIST"
            orderby s.Name
            select s).ToList<Keys>();

將其添加到數組中,然后使用Contains

var badCodes = new[] { "BadCode1", "BadCode2", "BadCode3", "BadCode4", "BadCode5"};

var keys = (from s in context.Keys
            where !badCodes.Contains(s.Code)
            orderby s.Name
            select s).ToList<Keys>();

所有其他答案都是正確的,但我個人是這個的粉絲:

假設您有一個名為blackList的字符串列表,其中包含您要過濾掉的所有字符串。

var keys = context.Keys.Where(x => !blackList.Contains(x.Code))
    .OrderBy(x => x.Name)
    .ToList();

我只是喜歡這使我的代碼可讀且易於理解的方式。 但同樣,所有其他答案都是正確的。

var keys = (from s in context.Keys
    where !blackList.Contains(s.Code)
    orderby s.Name
    select s).ToList(); // do you really need the ToList?

一個數組或列表(可以是)

如果您在內存中執行此操作(鏈接到對象),那么HashSet性能將比數組或列表更好。 如果您在數據庫中執行此操作,則不會有任何區別。

另外,你真的需要它在列表中嗎? 如果您要遍歷結果或以其他方式執行IEnumerable<>IQueryable<>將自行提供的內容,則最好將其排除在外。

創建一個包含所有無效值的List<string>

List<string> sBlackList = new List<string>(){"BadCode1", "BadCode2", "BadCode3"};

並替換

where s.Code != ANY OF THE VALUES FROM "BLACKLIST" 

where !sBlackList.Contains(s.Code)

要檢測任何集合的交集,您可以使用 .Contains() 方法。 它很簡單:

1)確定你的黑名單:

var blackList = new List<string> {"BadCode1", 
                                  "BadCode2", 
                                  "BadCode3", 
                                  "BadCode4",
                                  "BadCode5"};

2)通過與blackList(!blackList.Contains(s.Code))的交集過濾請求:

var keys = (from s in context.Keys
            where !blackList.Contains(s.Code)
            orderby s.Name
            select s).ToList<Keys>();

您還可以使用類似於此的except 方法

var badCodes = new[] { "BadCode1", "BadCode2", "BadCode3", "BadCode4", "BadCode5"};

var blackList = context.Keys.Where(s => badCodes.Contains(s.Code));
var filteredKeys = context.Keys.Except(blackList);

您可以有一個黑名單代碼列表並檢查它是否不包含相關代碼

var keys = (from s in context.Keys
            where !blackList.Contains(s.Code)
            orderby s.Name
            select s).ToList<Keys>();

嘗試將所有錯誤代碼放入 Hashset,並查找不在“blacklist-hashest”中的值

這里有一個很好的例子: https : //stackoverflow.com/a/3944821/1117305

暫無
暫無

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

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