是否可以根据这些对象的参数对自定义类对象列表进行子集化? (没有 LINQ)

Posted

技术标签:

【中文标题】是否可以根据这些对象的参数对自定义类对象列表进行子集化? (没有 LINQ)【英文标题】:is it possible to subset list of custom class objects based on a parameter of these objects? (without LINQ) 【发布时间】:2015-09-29 03:02:09 【问题描述】:

在不使用 LINQ 的情况下,我在 C# 中尝试实现的是根据这些对象的参数之一的值对自定义类对象列表进行子集化。

假设我的列表声明如下:

List<MyCustom> listofobj = new List<MyCustom>();

另外,假设自定义类对象“MyCustom”可以返回两个参数:MyCustom.name 和 MyCustom.age

有没有一种方法可以让我检索并保存到一个临时的新列表(我们称之为“templist”)中,原始列表的子集(即“listofobj”)由其所有具有“年龄”的 MyCustom 对象形成参数大于 30?谢谢!

【问题讨论】:

循环遍历列表,将满足谓词的元素添加到新列表中。这实际上与方法语法中的 where 子句后跟 to 列表相同。 Linq 会更有效率和可读性。为什么不使用它? 感谢您的评论!所以,首先我很抱歉没有提到我的意思是是否存在与所有条目中的蛮力循环不同的东西(我的列表有数千行)。我将编辑 que 问题。其次,是否有任何资料显示 LINQ 在处理时间方面比 for 循环更有效?我总是发现相反的结论,尽管 LINQ 确实更具可读性 @MAnd - 使用可读的 LINQ 除非您有明显的性能问题。即使这样使用for 循环也可能只会带来很小的性能提升。 【参考方案1】:

当然。您可以重新发明 LINQ:

IEnumerable<MyCustom> WhereByAge(IEnumerable<MyCustom> source, int age)

    foreach (MyCustom myCustom in source)
    
        if (myCustom.Age > age)
        
            yield return myCustom;
        
    

然后:

List<MyCustom> filteredList = new List(WhereByAge(listofobj, 30));

但是为什么呢?我强烈建议,如果您想要类似 LINQ 的行为,只需使用 LINQ。

【讨论】:

【参考方案2】:

这是您在没有 linq 的情况下根据参数获取原始列表子集的方式。

List<MyCustom> listofobj = new List<MyCustom>();
List<MyCustom> templist = new List<MyCustom>();

foreach(var obj in listofobj)

    if(obj.Age > 30)
    
        templist.Add(obj); 
    

你也可以使用这个 Linq。

templist = listofobj.Where(obj => obj.Age > 30).ToList();

Linq 通常比普通代码慢。但如果这不是代码中的热路径,这应该不是问题。性能差异可以忽略不计。

【讨论】:

“Linq 通常比普通代码慢” -- LINQ 可能会更慢,尤其是在误用时。但是上面的 LINQ 实现不会明显比显式实现慢。它实际上在做同样的事情。 这取决于你如何实现你的代码。无论如何,它的一个额外调用具有完全相同的实现。但我同意彼得杜尼霍的观点。如果滥用,linq 会减慢部分代码的速度。 @霍根

以上是关于是否可以根据这些对象的参数对自定义类对象列表进行子集化? (没有 LINQ)的主要内容,如果未能解决你的问题,请参考以下文章

根据对另一个 NSArray 字符串的排序,对自定义对象的 NSArray 进行排序

使用内部对象的实例变量的值对自定义对象数组进行排序

按属性对自定义对象的 ArrayList 进行排序

Java:通用的排序工具类,能够对自定义对象,针对不同的属性(字段),实现排序(正序倒序)

Qt中 使用Json 对自定义对象进行序列与反序列化 之二

按子类型[关闭]的Java组对象