我很难理解这是什么类型的语句以及如何使用.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);
任何帮助表示赞赏!
答案 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
的匿名类型,其中包含两个属性(myIdentiafication
和myName
),因此OrderBy(i => i.Id)
位不会编译。可以修复:
.OrderBy(i => i.myIdentiafication);
答案 1 :(得分:1)
这是一个LINQ查询。 Enumerable.Select
项目从文件到具有属性myIdentiafication
和myName
的匿名对象的每一行。然后使用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
返回的每个字符串创建一个具有两个属性(myIdentiaficiation
和myName
)的匿名对象。在选择上下文变量l
中,代表ReadLines
返回的集合中的一行。