0

我尝试使用 Linq 读取一个简单的 TXT 文件,但是,我的困难是。以 2 x 2 行读取文件,为此,我做了一个简单的函数,但是,我相信我可以读取 2 x 2 行分隔的 TXT ...

我阅读文本行的代码是:

    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 x 2 行?

--- Edit Maybe 可以创建一个新的 'linq' 函数,来实现 ???

Func<T> Get2Lines<T>(this Func<T> obj....) { ... }
4

2 回答 2

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; }
}
于 2013-10-31T17:24:33.777 回答
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();
于 2013-10-31T17:18:57.070 回答