使用Linq读取2行2行文件

时间:2013-10-31 17:08:41

标签: c# linq

我尝试使用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....) { ... }

2 个答案:

答案 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; }
}