需要帮助理解。选择方法C#

时间:2014-03-13 16:17:11

标签: c# oop select var paradigms

我很难理解这是什么类型的语句以及如何使用.select方法。

 var lines = System.IO.File.ReadLines(@"c:\temp\mycsvfil3.csv")
           .Select(l => new
           {
               myIdentiafication= int.Parse(l.Split(',')[0].Trim()),
               myName= l.Split(',')[1].Trim()
           }
             ).OrderBy(i => i.Id);

任何帮助表示赞赏!

3 个答案:

答案 0 :(得分:2)

Enumerable.Select方法是IEnumerable<T>类型的扩展方法。它需要Func<TSource, TResult>才能将您的IEnumerable<T>项目和项目项目带入其他项目,例如类型的属性或新类型。它大量使用编译器的泛型类型推断,在没有<>的情况下执行此操作。

在您的示例中,IEnumerable<T>是文件中的string[]行。 Select func会创建匿名类型(也会使用泛型类型推断)并根据每行l分配一些属性,这是一个string从你的可枚举。

OrderBy是另一种IEnumerable<T>扩展方法,并根据您提供的表达式继续按顺序返回IEnumerable<T>

此时

T是来自Select的匿名类型,其中包含两个属性(myIdentiaficationmyName),因此OrderBy(i => i.Id)不会编译。可以修复:

.OrderBy(i => i.myIdentiafication);

答案 1 :(得分:1)

这是一个LINQ查询。 Enumerable.Select 项目从文件到具有属性myIdentiaficationmyName的匿名对象的每一行。然后使用Enumerable.OrderBy对匿名对象序列进行排序。但是您应该选择存在于匿名对象中的属性。例如。 myIdentiafication,因为没有id属性:

var lines = File.ReadLines(@"c:\temp\mycsvfil3.csv") // get sequence of lines
                .Select(l => new {
                    myIdentiafication = int.Parse(l.Split(',')[0].Trim()),
                    myName= l.Split(',')[1].Trim()
                 }).OrderBy(i => i.myIdentiafication);

注意:为避免每行解析两次,您可以使用introducing new range variables的查询语法:

var lines = from l in File.ReadLines(@"c:\temp\mycsvfil3.csv")
            let pair = l.Split(',')
            let id = Int32.Parse(pair[0].Trim())
            orderby id
            select new {
                Id = id,
                Name = pair[1].Trim()
            };

答案 2 :(得分:0)

ReadLines返回的每个字符串创建一个具有两个属性(myIdentiaficiationmyName)的匿名对象。在选择上下文变量l中,代表ReadLines返回的集合中的一行。