【问题标题】:C# Filter List of objects by stringC#按字符串过滤对象列表
【发布时间】:2021-04-07 09:26:55
【问题描述】:

我有一个对象列表。每个对象都有 n 个属性。我还有一个包含 m [1..n] 属性名称的列表。

两个问题:

  1. 如何通过检查另一个列表中的一个属性是否包含字符串来过滤对象列表?
  2. 如何通过检查 ANY 属性是否包含字符串来过滤对象列表?

这是对象类:

public class MyModel
{
    public string POne { get; set; }
    public string PTwo { get; set; }
    public string PThree { get; set; }
}

在伪代码中会是这样的:

New List filtered
Foreach object o in myObjectList
If o.POne, o.PTwo or o.PThree contains string "test" 
    filtered.Add(o)
Else
    Next

我尝试修改来自this post 的代码,但无法正常工作。 另一个想法是创建一个包含所有属性值的嵌套列表。在那种情况下,我可以使用以下行进行过滤:

List<List<string>> filtered = testList.Where(q => q.Any(a => a.Contains(testString))).ToList();

但是创建所有这些额外的列表不是会产生很多开销吗? 性能是我关心的问题。

【问题讨论】:

  • 你有不同的课程?你能修改它们吗?不同的类是实现伪代码的唯一障碍吗?性能有多受关注(特别是考虑到您似乎愿意使用反射)?
  • @Theraot 过滤必须是通用的。它可用于过滤不同的类。它基本上是我在用户界面中显示的一个表格组件。当用户输入字母时,过滤必须“实时”执行。因此,性能至关重要。我对 C# 相当陌生,并认为反射是实现这一目标的唯一方法。如果这有助于我不知道在上下文中使用组件之前将显示哪些属性,我还可以编辑模型的类。
  • 我询问了有关修改课程的问题,因为它可以像当前答案中那样解决。如果您有多个类,则可以使用接口来处理。如果有多个类并且您无法修改它们,我们可以使用工厂制作帮助类。如果您根本不知道这些课程,那么是的,反思。然后我们会查看代码发出代码并缓存它以优化它(多次反映同一个类是没有意义的)。
  • List 可能正在使用指向源字符串的链接,而不是复制字符串。我喜欢使用字典和嵌套字典列表 Dictionary>>

标签: c#


【解决方案1】:

让您的类负责通过方法确定它是否匹配

public class MyModel
{
    public string POne { get; set; }
    public string PTwo { get; set; }
    public string PThree { get; set; }

    public bool DoesMatch(string tomatch)
    {
        return POne.Equals(tomatch) || 
           PTwo.Equals(tomatch) ||
           PThree.Equals(tomatch);
    }
}

那么你就可以这样做了

var filtered = testList.Where(q => q.DoesMatch("string to check"));

【讨论】:

  • 另外,如果代码不涉及模型本身,而是涉及其他层,您可以在 C# 中使用extension functions
  • 如果只检查模型的某些属性,我该如何处理?例如,一种情况是 POne,另一种情况是 PTwo + PThree
  • @UnusualWays 你可以有不同的检查不同的属性,然后调用相应的方法。或者有一个方法,类需要先确定需要检查什么,然后再检查。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-01
  • 1970-01-01
相关资源
最近更新 更多