当前位置: 首页 > 知识库问答 >
问题:

如何按属性名筛选类列表?

伯逸明
2023-03-14

我想通过作为字符串的属性名筛选类的集合。假设我有一个名为Person的类,我有它的一个集合,或者是IEnumerable或者是List,我想过滤这个集合,但是我不知道确切的过滤器,我的意思是我不能使用:

person.Where(x => x.Id == 1);

让我举一个例子。

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int YearOfBorn {get; set;}    
}
List<Person> p = new List<Person>();
public List<Person> Filter(string propertyName, string filterValue, List<Person> persons)

共有1个答案

陶腾
2023-03-14

从技术上讲,您可以尝试使用反射:

using System.Reflection;

... 

// T, IEnumerable<T> - let's generalize it a bit
public List<T> Filter<T>(string propertyName, string filterValue, IEnumerable<T> persons) {
  if (null == persons)
    throw new ArgumentNullException("persons");
  else if (null == propertyName)
    throw new ArgumentNullException("propertyName");

  PropertyInfo info = typeof(T).GetProperty(propertyName);

  if (null == info)
    throw new ArgumentException($"Property {propertyName} hasn't been found.", 
                                 "propertyName");

  // A bit complex, but in general case we have to think of
  //   1. GetValue can be expensive, that's why we ensure it calls just once
  //   2. GetValue as well as filterValue can be null
  return persons
    .Select(item => new {
      value = item,
      prop = info.GetValue(item),
    })
    .Where(item => null == filterValue
       ? item.prop == null
       : item.prop != null && string.Equals(filterValue, item.prop.ToString()))
    .Select(item => item.value)
    .ToList();
}
 类似资料:
  • 我有这个在重复播放 来自网站数组的每个网站对象如下所示: 问题:如何将过滤器应用于上述循环,使其仅显示属性为空数组的元素? 我尝试过的事情: (控制台中没有错误,但会过滤掉所有内容) (与我想要的相反,只显示组不是空数组的项目) (如果我用null代替[]来表示没有值,这是可行的,但看起来真的很混乱……因为我需要经常注意组属性变为空,并手动将其设置为null)

  • 我还有这个包含ID列表: 我想筛选以便筛选的不包含id来自的对象,因此我尝试使用stream: 我找不到做这件事的正确函数。有人有什么建议让我试试吗?

  • 我如何使用java流以相同的性能过滤一个对象? HashSet包含: 现在,我要筛选来生成一个新的,它具有唯一的-属性。 所有具有相同名称的对象都应被视为平等的对象: 我可以通过创建一个新的列表并使用2个for循环来解决这个问题,方法是索引下一个元素并查找(如果它已经放入列表中)。然而,也许有一个班轮这样的问题?可能使用?

  • 若要用单个列过滤数据文件(DF),如果我们考虑有男性和女性的数据,我们可以: 问题1——但如果数据跨越多年,而我只想看到2014年的男性会怎样? 在其他语言中,我可能会这样做: (除非我想这样做并在新的dataframe对象中获取原始dataframe的子集) 问题2。我如何在一个循环中实现这一点,并为每个独特的年份和性别集(即:2013年男性、2013年女性、2014年男性和2014年女性)创建

  • 问题内容: 我有这样的HTML, 现在,我需要编写一个jQuery,它将我的html中的所有属性都设为disable_onclick属性设置为true。在这种情况下,我应该获得3个元素,两个链接标签和一个输入标签。 问题答案: 这里的如何选择所有这些元素: 由于是CSS中有效的未加引号的属性值,因此您甚至可以省略引号: 如果您关心有效的HTML,则应考虑改用自定义属性。 这样,它就是有效的HTML

  • 我需要在序列化时动态过滤bean属性。 不是我的选择。 假设我的Bean(作为Json符号): 我想使用以下属性编写 JSON: 预期的 JSON 结果为: 最后,我将在RestController中创建一个注释(),用于Spring,如下所示: