2009-12-20 53 views
-2
List<byte[]> data = new List<string>(File.ReadAllLines(Filename)).ConvertAll<byte[]>(delegate(string value) 
    { 
     return new List<string>(value.Split('.')).ConvertAll<byte>(delegate(string byteVal) 
     { 
      return Convert.ToByte(byteVal); 
     }).ToArray(); 
    }); 
+0

更好?更快?大?更具可读性? – Kobi 2009-12-20 11:57:16

+4

你应该用当前的代码来描述你的问题,而不是只是粘贴你的代码,希望有人会花时间理解它,并猜测你想要什么。 – 2009-12-20 12:04:51

+1

Kobi:您忘记了更强,更难(请参阅http://www.dothedaft.com/idaft/) – tobsen 2009-12-20 19:24:10

回答

2

扩展方法往往比同等LINQ更简洁:

File.ReadAllLines(Filename).Select(
    line => line.Split('.').Select(ch => Convert.ToByte(ch)).ToArray() 
    ).ToArray(); 

在LINQ,这将是:

(from line in File.ReadAllLines(Filename) 
select (
    from ch in line.Split('.') 
    select Convert.ToByte(ch) 
    ).ToArray() 
).ToArray() 

我没有VS在我面前,所以我希望这不会太离谱。当然两个版本都需要VS9(2008)。

+2

'方法'System.Linq.Enumerable.Select (System.Collections.Generic。 IEnumerable ,System.Func )'不能从用法推断。尝试明确指定类型参数。这样做效果更好:'.Select(token => Convert.ToByte(token))',但与您的答案没有太大区别,以证明另一个答案:P – Kobi 2009-12-20 12:18:49

+0

感谢您的纠正,Kobi。我已经改变了答案。 – 2009-12-20 12:27:04

+0

谢谢。非常感激。 – adge 2009-12-20 14:18:43

1

嗯,我通常会消耗输入线路在同一时间(以允许处理大文件):

static IEnumerable<string> ReadLines(string path) { 
    using (var file = File.OpenText(path)) { 
     string line; 
     while ((line = file.ReadLine()) != null) { 
      yield return line; 
     } 
    } 
} 

,然后使用:

var qry = from line in ReadLines(Filename) 
      select Array.ConvertAll<string,byte>(line.Split('.'), Convert.ToByte); 

如果需要一个列表(而不是一个序列);

var list = qry.ToList(); 
相关问题