C# 使用Lambda和C将对象的泛型列表转换为定义的集合类#
这是我在两份不同的工作中看到的一个问题,这两份工作使用三层结构,但还没有找到一个干净的解决方法。我相信这也适用于使用LINQ语句 我有两个类,一个是对象,另一个是这些对象的定义集合,其中可能包含一些附加功能:C# 使用Lambda和C将对象的泛型列表转换为定义的集合类#,c#,.net,linq,list,C#,.net,Linq,List,这是我在两份不同的工作中看到的一个问题,这两份工作使用三层结构,但还没有找到一个干净的解决方法。我相信这也适用于使用LINQ语句 我有两个类,一个是对象,另一个是这些对象的定义集合,其中可能包含一些附加功能: public class TestObject { public Int32 id {get; set;} public string value {get; set;} } public class TestObjec
public class TestObject
{
public Int32 id {get; set;}
public string value {get; set;}
}
public class TestObjectCollection: List<TestObject>
{
public TestObject Get(Int32 id)
{
return this.FirstOrDefault(item => item.id==id);
}
}
似乎应该有一种方法可以将Lambda表达式返回的GenericList强制转换到TestObjectCollection,而不必在返回的结果中循环添加步骤。不,没有
ToList
创建一个列表
——如果不创建一个新的TestObjectCollection
,就无法将一个普通的列表
转换为TestObjectCollection
就我个人而言,我根本不会创建从列表派生的集合(我几乎总是使用组合),但如果您真的想拥有该集合,最简单的方法是创建您自己的扩展方法:
public static class TestEnumerable
{
public static TestObjectCollection ToTestObjectCollection(this IEnumerable<TestObject> source)
{
return new TestObjectCollection(source);
}
}
不,没有ToList
创建一个列表
——如果不创建一个新的TestObjectCollection
,就无法将一个普通的列表
转换为TestObjectCollection
就我个人而言,我根本不会创建从列表派生的集合(我几乎总是使用组合),但如果您真的想拥有该集合,最简单的方法是创建您自己的扩展方法:
public static class TestEnumerable
{
public static TestObjectCollection ToTestObjectCollection(this IEnumerable<TestObject> source)
{
return new TestObjectCollection(source);
}
}
似乎应该有一种方法来转换
在没有添加步骤的情况下,将Lamda表达式添加到我的TestObjectCollection
循环浏览我返回的结果
没有,因为对于泛型集合,您可以使用协方差,而不是反方差
除了Jon的解决方案(这很好),您还可以创建构造函数重载:
public class TestObjectCollection: List<TestObject>
{
public TestObjectCollection(IEnumerable<TestObject> list) { AddRange(list);}
...
}
似乎应该有一种方法来转换
在没有添加步骤的情况下,将Lamda表达式添加到我的TestObjectCollection
循环浏览我返回的结果
没有,因为对于泛型集合,您可以使用协方差,而不是反方差
除了Jon的解决方案(这很好),您还可以创建构造函数重载:
public class TestObjectCollection: List<TestObject>
{
public TestObjectCollection(IEnumerable<TestObject> list) { AddRange(list);}
...
}
我看不出使用列表
,或增强列表
,或添加范围(IEnumerable)
有什么问题AddRange
通常接受IEnumerable,这意味着您可以直接传递LINQ查询。问题更可能出现在TestObjectCollection
的实现中。您想用创建所需列表类型的不同扩展方法替换.ToList()
调用。也许您应该为DBSet
或list
编写一个扩展方法。我看不出使用列表的问题,或增强列表
,或添加范围(IEnumerable)
AddRange
通常接受IEnumerable,这意味着您可以直接传递LINQ查询。问题更可能出现在TestObjectCollection
的实现中,您想用创建所需列表类型的不同扩展方法替换.ToList()
调用。也许您应该向DBSet
或list
编写一个扩展方法。
public class TestObjectCollection: List<TestObject>
{
public TestObjectCollection(IEnumerable<TestObject> list) { AddRange(list);}
...
}
var resultAsCollection = new TestObjectCollection(data.Where(item => item.id > 0));