LINQ适合初学者

Iva*_*nov 9 c# linq

我喜欢C#,我喜欢这个框架,我也喜欢尽可能多地学习.今天我开始在C#中阅读有关LINQ的文章,我找不到任何对他一生中从未使用SQL的初学者有用的东西.

我发现这篇文章非常有用,我理解它的一小部分,但我想得到更多的例子.

在阅读了几次之后,我尝试在我的函数中使用LINQ,但是我失败了.

    private void Filter(string filename)
    {
        using (TextWriter writer = File.CreateText(Application.StartupPath + "\\temp\\test.txt"))
        {
            using(TextReader reader = File.OpenText(filename))
            {
                string line;
                while((line = reader.ReadLine()) != null)
                {
                    string[] items = line.Split('\t');
                    int myInteger = int.Parse(items[1]);
                    if (myInteger == 24809) writer.WriteLine(line); 
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

这就是我所做的,它没有用,结果总是错误的.

    private void Filter(string filename)
    {
        using (TextWriter writer = File.CreateText(Application.StartupPath + "\\temp\\test.txt"))
        {
            using(TextReader reader = File.OpenText(filename))
            {
                string line;
                while((line = reader.ReadLine()) != null)
                {
                    string[] items = line.Split('\t');
                    var Linqi = from item in items
                                where int.Parse(items[1]) == 24809
                                select true;
                    if (Linqi == true) writer.WriteLine(line); 
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

我要求两件事:

  1. 该函数如何使用尽可能多的Linq?
  2. 关于Linq的网站/书籍/文章,但请注意我在sql/linq中是一个不错的初学者.

先感谢您!

Jon*_*eet 18

那么使你的样本更"LINQy"的一件事就是IEnumerable<string>从文件中读取行.这是MiscUtil中我的LineReader类的简化版本:

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;

public sealed class LineReader : IEnumerable<string>
{
    readonly Func<TextReader> dataSource;

    public LineReader(string filename)
        : this(() => File.OpenText(filename))
    {
    }

    public LineReader(Func<TextReader> dataSource)
    {
        this.dataSource = dataSource;
    }

    public IEnumerator<string> GetEnumerator()
    {
        using (TextReader reader = dataSource())
        {
            string line;
            while ((line = reader.ReadLine()) != null)
            {
                yield return line;
            }
        }
    }


    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在你可以使用它:

    var query = from line in new LineReader(filename)
                let items = line.Split('\t')
                let myInteger int.Parse(items[1]);
                where myInteger == 24809
                select line;

    using (TextWriter writer = File.CreateText(Application.StartupPath 
                                               + "\\temp\\test.txt"))
    {
        foreach (string line in query)
        {
            writer.WriteLine(line);
        }
    }
Run Code Online (Sandbox Code Playgroud)

请注意,没有let条款可能会更有效:

    var query = from line in new LineReader(filename)
                where int.Parse(line.Split('\t')[1]) == 24809
                select line;
Run Code Online (Sandbox Code Playgroud)

此时你可以合理地用"点符号"完成所有操作:

    var query = new LineReader(filename)
                        .Where(line => int.Parse(line.Split('\t')[1]) == 24809);
Run Code Online (Sandbox Code Playgroud)

但是,我更喜欢原始查询的可读性:)


Joe*_*oey 5

101 LINQ Samples肯定是很好的例子.此外LINQPad可能与LINQ到玩的好方法.