如果List<int>
具有IEnumerable<CustomClass>
类型的属性,我希望使用CustomClass
int
,如何从customProperty
智能创建List<int>
创建我的List<CustomClass>
?
我知道我可以通过调用instance.ToList<CustomClass>();
如何提取属性信息以填充我的列表?这里的最佳做法是什么?
答案 0 :(得分:2)
使用Linq,您可以投射到该媒体资源,ToList()
生成IEnumerable<int>
:
var ints = customClasses.Select(c => c.customProperty).ToList();
如果您以前从未见过Linq扩展方法,Select
是一种常见的“投影”方法。它需要一个lambda表达式,在这种情况下是一个表达式为CustomClass
的表达式,表示为c
,它返回您想要的任何内容,在本例中为int
。由于Select
正在处理一个集合(可枚举的某些内容),您实际上会得到一个IEnumerable<int>
作为响应,它可以根据您的IEnumerable
lambda推断出Select
的类型。 / p>
如果您想要延迟播放IEnumerable<int>
,只需停止ToList()
来电。
我从不喜欢对最佳实践发表意见,但这是一个清晰的单行内容,清楚地表明了意图(假设对Linq的基本理解)并且我在整个地方看到它。
Linq资源:
http://www.codeproject.com/Articles/84521/LINQ-for-the-Beginner
http://www.codeproject.com/Articles/19154/Understanding-LINQ-C
Lambda表达资源:
http://msdn.microsoft.com/en-us/library/bb397687.aspx
或者,可以使用“LINQ教程”或“lambda表达教程”等术语轻松搜索这些主题。
答案 1 :(得分:0)
假设C#3.0,因此LINQ,
var intList = instance.Select(cc => cc.customProperty).ToList();
答案 2 :(得分:0)
使用Linq投影很容易做到这一点。功能表示法:
var myEnumerable = new IEnurable<CustomClass>;
// ... fill myEnumerable
List<int> customProperties
= myEnumrable.Select(item => item.customProperty).ToList();
lambada表达式item => item.customProperty
投影int,因此你得到一个int列表。基本上,lambda表达式相当于一个函数,它接收item
作为参数并返回item.customProperty
作为结果。像int foo(CustomaClass item) { return item.customProperty}
这样的东西。 lambda表达式的特殊性在于它是匿名的(没有foo
),并且返回和参数类型是从上下文中推断出来的。
Lambda Expressions (C# Programming Guide)
替代:
List<int> customProperties
= (from item in myEnumerable
select item.customProperty).ToList();
在这种情况下,投影直接在select
子句中完成。所有LINQ查询都在paretheses之间,以允许使用ToList()
实现它。
Query Expression Syntax Examples: Projection
在这里,我留下一个代码片段,您可以在其中查看类似查询的所有变体:
public class Thing
{
public string Name { get; set; }
public decimal Value { get; set; }
}
public decimal GetValue(Thing thing)
{
return thing.Value;
}
public Thing[] Things =
{
new Thing { Name="Stapler", Value=20.35M},
new Thing { Name="Eraser", Value=0.65M}
};
[TestMethod]
public void GetValueListFromThing()
{
// query notation, direct projection
List<decimal> valuesA
= (from t in Things
select t.Value).ToList();
// query notation, projection with method
List<decimal> valuesB
= (from t in Things
select GetValue(t)).ToList();
// functional notation, projection with method
List<decimal> valuesC
= Things.Select(t => GetValue(t)).ToList();
// functional notation, projection with anonymous delegate
List<decimal> valuesD
= Things.Select(t => { return t.Value; }).ToList();
// functional notation, lambda expression
List<decimal> values
= Things.Select(t => t.Value).ToList();
}