我尝试使用Linq读取一个简单的TXT文件,但是,我的困难是。读取2行2行的文件,为此,我做了一个简单的函数,但是,我相信我可以读取TXT分离2乘2行......
我阅读文字行的代码是:
private struct Test
{
public string Line1, Line2;
};
static List<Test> teste_func(string[] args)
{
List<Test> exemplo = new List<Test>();
var lines = File.ReadAllLines(args[0]).Where(x => x.StartsWith("1") || x.StartsWith("7")).ToArray();
for(int i=0;i<lines.Length;i++)
{
Test aux = new Test();
aux.Line1 = lines[i];
i+=1;
aux.Line2 = lines[i];
exemplo.Add(aux);
}
return exemplo;
}
在创建此功能之前,我尝试这样做:
var lines = File.ReadAllLines(args[0]). .Where(x=>x.StartsWith("1") || x.StartsWith("7")).Select(x =>
new Test
{
Line1 = x.Substring(0, 10),
Line2 = x.Substring(0, 10)
});
但是,显而易见的是,该系统将逐行获取并为该行创建一个新的结构... 那么,我如何通过linq获得2行2?
---编辑 也许有可能创建一个新的'linq'函数,使其成为???
Func<T> Get2Lines<T>(this Func<T> obj....) { ... }
答案 0 :(得分:1)
这样的东西?
public static IEnumerable<B> MapPairs<A, B>(this IEnumerable<A> sequence,
Func<A, A, B> mapper)
{
var enumerator = sequence.GetEnumerator();
while (enumerator.MoveNext())
{
var first = enumerator.Current;
if (enumerator.MoveNext())
{
var second = enumerator.Current;
yield return mapper(first, second);
}
else
{
//What should we do with left over?
}
}
}
然后
File.ReadAllLines(...)
.Where(...)
.MapPairs((a1,a2) => new Test() { Line1 = a1, Line2 = a2 })
.ToList();
答案 1 :(得分:1)
File.ReadLines("example.txt")
.Where(x => x.StartsWith("1") || x.StartsWith("7"))
.Select((l, i) => new {Index = i, Line = l})
.GroupBy(o => o.Index / 2, o => o.Line)
.Select(g => new Test(g));
public struct Test
{
public Test(IEnumerable<string> src)
{
var tmp = src.ToArray();
Line1 = tmp.Length > 0 ? tmp[0] : null;
Line2 = tmp.Length > 1 ? tmp[1] : null;
}
public string Line1 { get; set; }
public string Line2 { get; set; }
}