LINQ для новичков

Первая установка Laravel 5.6 Я также столкнулся с этой ошибкой. Просто выполните следующие шаги, чтобы исправить это:

  • Убедитесь, что требование к файлу composer.json имеет:
    "require": {
        "php": "^7.1.3",
        "fideloper/proxy": "^4.0",
            },
  • Затем попробуйте composer update убедитесь, что ваш композитор обновлен
  • Наконец запустите: composer require fideloper/proxy:~4.0
  • Готово!
9
задан nbanic 14 April 2014 в 13:22
поделиться

12 ответов

Что ж, одна вещь, которая сделает ваш образец более «LINQy» - это IEnumerable для чтения строк из файла . Вот несколько упрощенная версия моего класса LineReader из MiscUtil :

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();
    }
}

Теперь вы можете использовать это:

    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);
        }
    }

Обратите внимание, что, вероятно, было бы более эффективно не иметь ] let clauses:

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

в этот момент вы могли бы разумно делать все это в "точечной нотации":

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

Однако я предпочитаю удобочитаемость исходного запроса :)

18
ответ дан 4 December 2019 в 07:48
поделиться

101 LINQ Samples , безусловно, хороший набор примеров. Также LINQPad может быть хорошим способом поиграть с LINQ.

5
ответ дан 4 December 2019 в 07:48
поделиться

Для веб-сайта в качестве отправной точки вы можете попробовать Подключено к LINQ

Изменить :
Оригинальный сайт кажется мертвым (домен продается).

Вот интернет-архив последней версии: https://web.archive.org/web/20140823041217/http://www.hookedonlinq.com/

4
ответ дан 4 December 2019 в 07:48
поделиться
0
ответ дан 4 December 2019 в 07:48
поделиться

Если вам нужна книга, я нашел LINQ в действии из Manning Publications - хорошее место для начала.

2
ответ дан 4 December 2019 в 07:48
поделиться

Сначала я бы представил этот метод:

private IEnumerable<string> ReadLines(StreamReader reader)
{
    while(!reader.EndOfStream)
    {
        yield return reader.ReadLine();
    }
}

Затем я бы реорганизовал основной метод, чтобы использовать его. Я поместил оба оператора с использованием над одним и тем же блоком, а также добавил проверку диапазона, чтобы убедиться, что items [1] не дает сбоев:

private void Filter(string fileName)
{
    using(var writer = File.CreateText(Application.StartupPath + "\\temp\\test.txt"))
    using(var reader = File.OpenText(filename))
    {
        var myIntegers =
            from line in ReadLines(reader)
            let items = line.Split('\t')
            where items.Length > 1
            let myInteger = Int32.Parse(items[1])
            where myInteger == 24809
            select myInteger;

        foreach(var myInteger in myIntegers)
        {
            writer.WriteLine(myInteger);
        }
    }
}
0
ответ дан 4 December 2019 в 07:48
поделиться

Я получил много из следующего сайты, когда я начинал:

http://msdn.microsoft.com/en-us/library/bb425822.aspx

http://weblogs.asp.net/scottgu/archive/2007/05/19/ using-linq-to-sql-part-1.aspx

0
ответ дан 4 December 2019 в 07:48
поделиться

Чтобы ответить на первый вопрос, честно говоря, нет особых причин использовать LINQ так, как вы предлагаете в приведенной выше функции, за исключением упражнение. Фактически, это, вероятно, просто затрудняет чтение функции.

LINQ более полезен при работе с коллекцией, чем с отдельным элементом, и я бы использовал его таким образом. Так вот' s моя попытка использовать как можно больше LINQ в функции (не упоминайте об эффективности, и я не предлагаю читать весь файл в память следующим образом):

private void Filter(string filename)
{
    using (TextWriter writer = File.CreateText(Application.StartupPath + "\\temp\\test.txt"))
    {
        using(TextReader reader = File.OpenText(filename))
        {
            List<string> lines;
            string line;
            while((line = reader.ReadLine()) != null)
                lines.Add(line);

            var query = from l in lines
                        let splitLine = l.Split('\t')
                        where int.Parse(splitLine.Skip(1).First()) == 24809
                        select l;

            foreach(var l in query)               
                writer.WriteLine(l); 
        }
    }
}
0
ответ дан 4 December 2019 в 07:48
поделиться

Я обнаружил, что эта статья чрезвычайно важна для понимания LINQ, который основан на таком большом количестве новых конструкций, введенных в .NET 3.0 и 3.5:

Предупреждаю, что это долгое чтение , но если вы действительно хотите понять, что такое Linq и считаю ли это необходимым

http://blogs.msdn.com/ericwhite/pages/FP-Tutorial.aspx

Приятного чтения

0
ответ дан 4 December 2019 в 07:48
поделиться

Если бы мне пришлось переписать вашу функцию фильтра, используя LINQ, где это возможно, это выглядело бы так:

private void Filter(string filename)
{
    using (TextWriter writer = File.CreateText(Application.StartupPath + "\\temp\\test.txt"))
    {
        var lines = File.ReadAllLines(filename);
        var matches = from line in lines
                      let items = line.Split('\t')
                      let myInteger = int.Parse(items[1]);
                      where myInteger == 24809
                      select line;

        foreach (var match in matches)
        {
            writer.WriteLine(line)
        }
    }
}
0
ответ дан 4 December 2019 в 07:48
поделиться

Что касается книг Linq, я бы порекомендовал:


(источник: ebookpdf.net )
http://www.diesel-ebooks.com/mas_assets/full/0321564189.jpg

Обе книги - отличные книги, в которых подробно рассматривается Linq.

Чтобы добавить еще одну вариацию к as-much- Тема linq-as-possible, вот мой вариант:

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

namespace LinqDemo
{
    class Program
    {
        static void Main()
        {
            var baseDir = AppDomain.CurrentDomain.BaseDirectory;
            File.WriteAllLines(
                Path.Combine(baseDir, "out.txt"),
                File.ReadAllLines(Path.Combine(baseDir, "in.txt"))
                    .Select(line => new KeyValuePair<string, string[]>(line, line.Split(','))) // split each line into columns, also carry the original line forward
                    .Where(info => info.Value.Length > 1) // filter out lines that don't have 2nd column
                    .Select(info => new KeyValuePair<string, int>(info.Key, int.Parse(info.Value[1]))) // convert 2nd column to int, still carrying the original line forward
                    .Where(info => info.Value == 24809) // apply the filtering criteria
                    .Select(info => info.Key) // restore original lines
                    .ToArray());
        }
    }
}

Обратите внимание, что я изменил ваши столбцы, разделенные табуляцией, на столбцы, разделенные запятыми (легче писать в моем редакторе, который преобразует табуляции в пробелы ;-)). Когда эта программа запускается с входным файлом:

A1,2
B,24809,C
C

E
G,24809

Результатом будет:

B,24809,C
G,24809

Вы можете улучшить требования к памяти для этого решения, заменив File.ReadAllLines и File.WriteAllLines на LineReader Джона Скита (и LineWriter в аналогичным образом, используя IEnumerable и записывая каждый возвращенный элемент в выходной файл как новую строку). Это преобразовало бы вышеприведенное решение из «получить все строки в памяти как массив, отфильтровать их,

0
ответ дан 4 December 2019 в 07:48
поделиться

не может просто проверить, является ли Linqi истинным ... Linqi является IEnumerable (в данном случае), поэтому необходимо проверить, например, Linqi.First ( ) == true

вот небольшой пример:

string[] items = { "12121", "2222", "24809", "23445", "24809" };

                        var Linqi = from item in items
                                    where Convert.ToInt32(item) == 24809
                                    select true;
                        if (Linqi.First() == true) Console.WriteLine("Got a true");

Вы также можете перебирать Linqi, и в моем примере в коллекции 2 элемента.

-1
ответ дан 4 December 2019 в 07:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: