使用CustomClass类型的属性</customclass>创建列表IEnumerable <customclass>

时间:2012-04-18 09:52:00

标签: c# list casting ienumerable

如果List<int>具有IEnumerable<CustomClass>类型的属性,我希望使用CustomClass int,如何从customProperty智能创建List<int>创建我的List<CustomClass>

我知道我可以通过调用instance.ToList<CustomClass>();

来创建{{1}}

如何提取属性信息以填充我的列表?这里的最佳做法是什么?

3 个答案:

答案 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();

    }