gpt4 book ai didi

c# - 过滤给定单个对象的对象列表

转载 作者:行者123 更新时间:2023-11-30 16:39:34 25 4
gpt4 key购买 nike

我想要一个接受对象列表的方法,然后是“过滤器对象”(与对象列表的类型相同)。我能够在小范围内(低效地)做到这一点,但也非常固定——我希望它是一种通用方法,这样我就可以传入类型,这样它就可以应用于任何事物。

例子:

public class Program {
public void Main(string[] args) {
var listOfObjects = new List<MyClass> {
new MyClass { ID = 1, Name = "Object 1" },
new MyClass { ID = 2, Name = "Object 2" },
new MyClass { ID = 3, Name = "Object 2" }
};
var filter = new MyClass { Name = "Object 2" };

// Should return only the first object in the list, since
// the filter's Name = "Object 2", all items in the list
// where the property equals "Object 2" will be filtered out
var filteredList = FilterObjects(listOfObjects, filter);
}
}

public class MyClass {
public int ID { get; set; }
public string Name { get; set; }
}

public class MyTest {
public List<MyClass> FilterObjects(List<MyClass> objects, MyClass filter) {
// first check if the filter is just an empty new instance
// if a user passes in an empty filter then they are not
// filtering anything, therefore
if (filter == new MyClass()) return objects;

var filteredList = new List<MyClass>();
foreach (var item in objects) {
// if this item passes the test for the filter
// (check if any of the properties are equal to the
// filter properties - if so, then this item is not
// is not a match, and we cannot add it to the list)
if (item.ID != filter.ID && item.Name != filter.Name)
filteredList.Add(item);
// What I want is a faster and more consolidated way of
// checking all the properties.
}
return filteredList;
}
}

编辑:有没有办法也使用反射来做到这一点?

EDIT2:只是想澄清一下,我这里的例子只是一个简单的模板。我正在处理一个具有 20 多个属性的对象,如果可能的话,我希望不必做一个巨大的 if 语句。

EDIT3:我还应该提到用户传入的过滤器对象可能不完整,例如他们可以传入一个没有 ID(只是 Name 属性)的 MyClass 对象,因为当它到达我的 Controller 时,MyClass 对象将自动用默认值填充 ID。我可以通过创建 MyClass 的新实例 - new MyClass() 来检查它是否是默认值,对于每个属性,如果它等于默认值,则忽略该属性进行过滤,因为用户不想过滤该属性。但是从更大的范围考虑这个概念,我有 20 多个属性,用户想要过滤掉所有对象,但只想使用其中的 3 个属性进行过滤。其他 17+ 个属性将不会进行相等性检查。

最佳答案

听起来您想要的是通用语句。

这不是 super 简单,但像这样的东西应该可以工作:

public static IEnumerable<T> Filter<T>(this IEnumerable<T> results, Filter filter)
{
var types = results.GetType().GetProperties();

foreach (var filter in filter.Filters)
{
Type type = results.GetType();
filter.ColumnName = filter.ColumnName.Replace(" ", "");
var pred = BuildPredicate<T>(filter.ColumnName, filter.FilterValue);
if (filter.ColumnName != null && filter.FilterValue != null)
{
results = results.Where(w =>
{
return w.GetType().GetProperty(filter.ColumnName).GetValue(w, null).ToString().ToLowerInvariant().Contains(filter.FilterValue.ToLowerInvariant());
});
}
}

return results;
}

过滤器对象看起来像这样:

public class Filter
{
public string ColumnName {get; set; }
public string Value { get; set; }
//Other properties for Asc / Desc and more
}

然后在像 List 或 List 这样的任何 List 上你基本上会做:

var results = MyList.Filter(new Filter() { ColumnName = "LastName"; Value = "Smith" });

它被翻译成一个函数,如果手动输入它看起来像:

var results = MyList.Where(w => w.LastName == "Smith");

但是这个例子很粗糙,没有对初学者进行类型检查。

关于c# - 过滤给定单个对象的对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52956599/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com