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;
有几种可能性:
IEnumerable
的构造函数,因此您可以根据查询结果创建一个新的PersonCollectionIEnumerable
(这是我建议的选项)IEnumerable
的构造函数,因此您可以根据查询结果创建一个新的PersonCollectionIEnumerable
(这是我建议的选项)@乔恩,你的键盘怎么了<代码>'和
都是奇怪的符号。@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在