C# 如何在按[Where]筛选后返回[List<;]的受驱动集合?

C# 如何在按[Where]筛选后返回[List<;]的受驱动集合?,c#,linq,C#,Linq,在以下集合中: public class PersonsCollection : List<Person> public class PersonsCollection : List<Person> { public PersonsCollection() { } public PersonsCollection(IEnumerable<Person> persons) : base(persons) { } } 任何想法 您必须创建PersonC

在以下集合中:

public class PersonsCollection : List<Person>
public class PersonsCollection : List<Person> {
  public PersonsCollection() { }
  public PersonsCollection(IEnumerable<Person> persons) : base(persons) { }
}

任何想法

您必须创建
PersonCollection
的新实例,例如

return new PersonsCollection(personsCollection.Where(p => p.Name == "Jack"))
假设您有一个合适的构造函数


一般来说,无论如何扩展内置集合(而不是使用组合)都不是一个好主意-您确定首先要使用此设计吗?

您必须创建
PersonCollection
的新实例,例如

return new PersonsCollection(personsCollection.Where(p => p.Name == "Jack"))
假设您有一个合适的构造函数


通常,无论如何扩展内置集合(而不是使用组合)都不是一个好主意-您确定首先要使用此设计吗?

您可以为
IEnumerable
创建一个扩展方法
ToList()

public static class PersonCollectionExtensions
{
    public static List<Person> ToList(this IEnumerable<Person> self)
    {
         return new PersonCollection(self);
    }
}
公共静态类PersonCollectionExtensions
{
公共静态列表ToList(此IEnumerable self)
{
返回新的PersonCollection(self);
}
}

您可以为
IEnumerable
创建扩展方法
ToList()

public static class PersonCollectionExtensions
{
    public static List<Person> ToList(this IEnumerable<Person> self)
    {
         return new PersonCollection(self);
    }
}
公共静态类PersonCollectionExtensions
{
公共静态列表ToList(此IEnumerable self)
{
返回新的PersonCollection(self);
}
}

您需要在集合中创建适当的构造函数:

public class PersonsCollection : List<Person>
public class PersonsCollection : List<Person> {
  public PersonsCollection() { }
  public PersonsCollection(IEnumerable<Person> persons) : base(persons) { }
}
从您对
CollectionBase
的评论中,我猜您是在重构旧代码,而不是使用泛型。写了一篇关于我的博客。你也可能会发现他在博客上的评论很有趣:

我们建议使用
集合
只读集合
,或
键控集合
作为输出、属性和接口
IEnumerable
ICollection
IList
作为输入


您只需摆脱
PersonCollection
,使用类似
Collection
的方法即可。

您需要在集合中创建适当的构造函数:

public class PersonsCollection : List<Person>
public class PersonsCollection : List<Person> {
  public PersonsCollection() { }
  public PersonsCollection(IEnumerable<Person> persons) : base(persons) { }
}
从您对
CollectionBase
的评论中,我猜您是在重构旧代码,而不是使用泛型。写了一篇关于我的博客。你也可能会发现他在博客上的评论很有趣:

我们建议使用
集合
只读集合
,或
键控集合
作为输出、属性和接口
IEnumerable
ICollection
IList
作为输入

您可以简单地摆脱
PersonCollection
,而使用类似
Collection
的内容。

类似这样的内容:

new PersonsCollection(personCollections.Where(p => p.Name == "Jack"));
var pc = new PersonCollection();
pc.AddRange(personCollections.Where(p => p.Name == "Jack").ToArray());
return pc;
大概是这样的:

new PersonsCollection(personCollections.Where(p => p.Name == "Jack"));
var pc = new PersonCollection();
pc.AddRange(personCollections.Where(p => p.Name == "Jack").ToArray());
return pc;
有几种可能性:

  • PersonCollection有一个接受
    IEnumerable
    的构造函数,因此您可以根据查询结果创建一个新的PersonCollection

  • 您可以创建一个新的扩展方法ToPersonsCollection(),用于构造PersonCollection(可以与上述方法结合使用)

  • 您可以更改依赖项,以便其他代码不需要PersonCollection,而是可以使用
    IEnumerable
    (这是我建议的选项)

  • 有几种可能性:

  • PersonCollection有一个接受
    IEnumerable
    的构造函数,因此您可以根据查询结果创建一个新的PersonCollection

  • 您可以创建一个新的扩展方法ToPersonsCollection(),用于构造PersonCollection(可以与上述方法结合使用)

  • 您可以更改依赖项,以便其他代码不需要PersonCollection,而是可以使用
    IEnumerable
    (这是我建议的选项)


  • @乔恩,你的键盘怎么了<代码>'和
    都是奇怪的符号。@Darin:我在Cr-48上,它用引号做着奇怪的事情。需要找出解决方法…@Jon,这是谷歌视频中介绍的笔记本吗?在谷歌视频中,他们打碎了至少20个笔记本?@Jon,我不确定我是否需要从
    列表中派生。实际上,我使用的是
    CollectionBase
    ,从一个旧代码转换了这个代码,仅此而已。@Darin:就是那个。除了当前的键盘处理(以及缺少C#编译器)之外,它被证明非常好。@Jon,你的键盘怎么了:-)<代码>'
    都是奇怪的符号。@Darin:我在Cr-48上,它用引号做着奇怪的事情。需要找出解决方法…@Jon,这是谷歌视频中介绍的笔记本吗?在谷歌视频中,他们打碎了至少20个笔记本?@Jon,我不确定我是否需要从
    列表中派生。实际上,我使用的是
    CollectionBase
    ,从一个旧代码转换了这个代码,仅此而已。@Darin:就是那个。除了当前的键盘处理(以及缺少C#编译器)之外,它被证明是非常好的。对于习惯LINQ对象的人来说,这将是非常令人困惑的。如果您将其称为TopersonCollection(并更改了返回类型),则更容易说明问题。
    PersonCollection
    List
    ?但我明白你的意思。我只是想让他的代码工作。当然,它可能应该被称为
    topersoncollection()
    。是的,它是-但是您真的想强制OP在他们调用它时强制强制转换,并将值分配给
    personcollection
    变量吗?考虑到与普通的
    ToList
    方法相比,这个方法的全部目的是创建一个不同的类型,因此在返回类型方面忽略这一点似乎是毫无意义的。对于习惯于LINQ对象的人来说,这将是非常混乱的。如果您将其称为TopersonCollection(并更改了返回类型),则更容易说明问题。
    PersonCollection
    List?但我明白你的意思。我只是想让他的代码工作。当然,它可能应该被称为
    topersonscolection()
    。是的,它是-但是你真的想强制OP在