使用Linq根据不同的对象列表过滤对象列表

本文关键字:对象 列表 过滤 Linq 使用 | 更新日期: 2023-09-27 17:58:59

我目前有两种类型的列表:列表(名为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中排除符合任何应用的Filter标准的PCM消息,并将它们存储在List FiltLintMessage中。例如,如果FilterList包含两个过滤器:

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

然后,我希望从LintMessages创建一个List FiltIntMessages,它排除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(); 

如有任何帮助,我们将不胜感激。

/*编辑以解决盖隆建议的解决方案。使用调试器进行调试表明,这是与该问题唯一相关的代码。正确的项目在该块的每个列表中,并且在分配给FiltIntMessages时,两个单独的筛选器(排除messagetype"Warning"和messagecode=10,两者都已应用)仅排除messagecode=10PCM消息,因为它是列表中最后一个应用的筛选器(使用多个筛选器的多个实例进行测试)。但是,该代码使用单个应用的筛选器,不包括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

使用Linq根据不同的对象列表过滤对象列表

这将按顺序将每个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 ();