簡體   English   中英

避免使用linq多次瀏覽列表,具有動態條件(過濾器)

[英]Avoid to browse a list multiple time with linq, with dynamic conditions (filter)

我有一個包含Article對象的列表。 該對象的參數是

類別,描述,狀態,類

用戶可以使用他想要的組合過濾列表。 僅描述,或類別+類,依此類推。

因此,如果用戶選擇一個標准,我將得到一個int> = 0,否則我將得到-1。

例如,如果他選擇過濾StatusCategory ,我會得到

FilterCategory = x,FilterDescription = -1,FilterStatus = y,FilterClass = -1

我過濾列表的方法如下:

if (FilterCategory != -1)
    list = list.Where(a => a.Category == FilterCategory);
if (FilterDescription != -1)
    list = list.Where(a => a.Description == FilterDescription);
if (FilterStatus != -1)
    list = list.Where(a => a.Status == FilterStatus);
if (FilterClass != -1)
    list = list.Where(a => a.Class == FilterClass);

通過這種方式,我必須迭代列表4次,它對很多項目效率不高。 我會瀏覽一次列表,並在一個獨特的位置檢查4條件。 但我不知道具體情況如何做到這一點!= -1。

謝謝

作為Juharr在評論中提到,LINQ的不會評價你的.Where調用它之后。 只有在調用ToList/ToArray/First/Single/foreach時,它才會評估該子句,它會自動組合您的過濾器。

你可以做一個巨大的地方查詢將所有條件移動到一個Where通過注意:

if (FilterCategory != -1)
    list = list.Where(a => a.Category == FilterCategory);

相當於:

list = list.Where(a => FilterCategory == -1 || a.Category == FilterCategory);

然后查詢是:

list = list.Where(a => (FilterCategory == -1 || a.Category == FilterCategory)
                    && (FilterDescription == -1 || a.Description == FilterDescription)
                    && (FilterStatus == -1 || a.Status == FilterStatus)
                    && (FilterClass == -1 || a.Class == FilterClass));

但我真的懷疑它會提高你的枚舉性能。

list = list.Where(a => (FilterCategory != -1 || a.Category == FilterCategory) && 
                                       (FilterDescription != -1 || a.Description == FilterDescription) &&
                                       (FilterStatus != -1 || a.Status == FilterStatus) &&
                                       (FilterClass != -1 || a.Class == FilterClass));

暫無
暫無

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

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