[英]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.