我正在构建一个过滤器系统来操作一个看起来像这样的简单集合:
public class ProcessedData
{
public byte ProcessId { get; set; }
public List<EventsData> EventsData { get; set; } = new List<EventsData>();
}
EventsData
对象的id属性如下:
public class EventData
{
public byte EventDataId { get; set; }
}
现在这个想法很简单,我有一个选定的ProcessId和EventId的集合,形式如下:
public List<byte> SelectedProcessFilter { get; set; }
public List<byte> SelectedEventFilter { get; set; }
所以我准备了聚合,其中条件的功能如下:
public IEnumerable<ProcessedData> DataFilter(IEnumerable<ProcessedData> preprocessedData, Expression<Func<ProcessedData, bool>>[] filters)
{
if (filters != null)
{
preprocessedEvents = filters.Aggregate(preprocessedData, (current, filter) => current.Where(filter.Compile()));
}
return preprocessedEvents.ToList();
}
现在我可以宣布条件类似的地方:
private Expression<Func<ProcessedData, bool>>[] BuildPredicate()
{
var predicates = new List<Expression<Func<ProcessedData, bool>>>();
if (SelectedProcessFilter != null && SelectedProcessFilter .Any())
{
predicates.Add(data => SelectedProcessFilter.Contains(data.ProcessId));
}
if (SelectedEventFilter != null && SelectedEventFilter.Any())
{
predicates.Add(data => SelectedEventFilter.Any(value => data.EventsData.Any(target => target.EventDataId == (byte)value.Value)));
}
return predicates.ToArray();
}
用法很简单:
IEnumerable<ProcessedData> filteredPreprocessedData = service.DataFilter(preprocessedEvents, BuildPredicate());
并且基本上有效,但是当我对EventsDataId进行过滤时会有一个变量,它会检查这个值是否仅在该属性中,是否有可能以某种方式重建这样的属性,以便它只包含选定的EventId?
答案 0 :(得分:0)
就像我现在所做的那样,我让NetMage建议并且只是制作了具有新属性值的对象副本。