簡體   English   中英

使用 Linq 根據不同的對象列表過濾對象列表

[英]Filter a List of Objects Based on A Different List of Objects with Linq

我目前有兩種類型的列表:列表(名為 LintMessages)和列表(名為 FilterList)。

PCMessages Properties:
    public string filename { get; set; }
    public int linenumber { get; set; }
    public string messagetype { get; set; }
    public int messagecode { get; set; }
    public string description { get; set; }
    public string evaluated { get; set; }
    public string comment { get; set; }

Filter Properties:
    public bool applied { get; set; }
    public string messagetype { get; set; }
    public int messagecode { get; set; }
    public string evaluated { get; set; }
    public string filename { get; set; }

目標是從符合任何應用過濾器標准的 LintMessages 中排除 PCMessages,並將它們存儲在 List FiltLintMessages 中。 例如,如果 FilterList 包含兩個過濾器:

Filter1 Properties:
    applied = true;
    messagetype = Warning;
Filter2 Properties:
    applied = true;
    messagecode = 12;
    evaluated = "WIP";

然后,我希望從 LintMessages 創建一個 List FiltLintMessages,排除任何 messagetype 包含“Warning”或 messagecode=12 或評估包含“WIP”的條目。

撰寫本文時的代碼:

FiltLintMessages = (from mess in LintMessages
                    from filt in FilterList
                    where !mess.evaluated.Contains(filt.evaluated)
                         && !mess.filename.Contains(filt.filename) 
                         && mess.messagecode != filt.messagecode
                         && !mess.messagetype.Contains(filt.messagetype)
                    select mess).ToList(); 

任何幫助,將不勝感激。

/* 編輯以解決 gaearon 建議的解決方案。 使用調試器單步執行表明這是唯一與問題相關的代碼。 正確的項目位於此塊的每個列表中,並且在分配給 FiltLintMessages 時,兩個單獨的過濾器(排除消息類型“警告”和消息代碼 = 10,均已應用)僅排除消息代碼 = 10 PCMessages,因為它是最后應用的過濾器列表(使用多個過濾器的多個實例進行測試)。 但是,該代碼與一個應用的過濾器一起工作,不包括 messagetype = "Warning" 和 messagecode = 10。上傳更多代碼將無濟於事,並且會使帖子更加陷入困境(程序變得非常大)。 */

IEnumerable<PCMessage> messages = LintMessages;

foreach (LintMessageFilter filter in FilterList.Where(f => f.applied))
{
    messages = messages.Where(
               m => !m.evaluated.Contains(filter.evaluated)
                       && !m.filename.Contains(filter.filename)
                       && m.messagecode != filter.messagecode
                       && !m.messagetype.Contains(filter.messagetype)
                );
}

FiltLintMessages = messages.ToList(); //FiltLintMessages already initialized

這將按順序將每個applied的過濾器應用於序列。

IEnumerable<PCMessages> messages = LintMessages;

foreach (var filterIter in FilterList.Where(f => f.applied)) {
    var filter = filterIter; // capture current filter
    messages = messages.Where (m =>
                   !m.evaluated.Contains (filter.evaluated)
                   && !m.filename.Contains (filter.filename)
                   && m.messagecode != filter.messagecode
                   && !m.messagetype.Contains (filter.messagetype)
    );
}

var FiltLintMessages = messages.ToList ();

暫無
暫無

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

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