Первая установка Laravel 5.6 Я также столкнулся с этой ошибкой. Просто выполните следующие шаги, чтобы исправить это:
composer.json
имеет: "require": { "php": "^7.1.3", "fideloper/proxy": "^4.0", },
composer update
убедитесь, что ваш композитор обновлен composer require fideloper/proxy:~4.0
Что ж, одна вещь, которая сделает ваш образец более «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);
Однако я предпочитаю удобочитаемость исходного запроса :)
101 LINQ Samples , безусловно, хороший набор примеров. Также LINQPad может быть хорошим способом поиграть с LINQ.
Для веб-сайта в качестве отправной точки вы можете попробовать Подключено к LINQ
Изменить :
Оригинальный сайт кажется мертвым (домен продается).
Вот интернет-архив последней версии: https://web.archive.org/web/20140823041217/http://www.hookedonlinq.com/
Примеры MSDN LINQ: http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx
Если вам нужна книга, я нашел LINQ в действии из Manning Publications - хорошее место для начала.
Сначала я бы представил этот метод:
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);
}
}
}
Я получил много из следующего сайты, когда я начинал:
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
Чтобы ответить на первый вопрос, честно говоря, нет особых причин использовать 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);
}
}
}
Я обнаружил, что эта статья чрезвычайно важна для понимания LINQ, который основан на таком большом количестве новых конструкций, введенных в .NET 3.0 и 3.5:
Предупреждаю, что это долгое чтение , но если вы действительно хотите понять, что такое Linq и считаю ли это необходимым
http://blogs.msdn.com/ericwhite/pages/FP-Tutorial.aspx
Приятного чтения
Если бы мне пришлось переписать вашу функцию фильтра, используя 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)
}
}
}
Что касается книг 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 и записывая каждый возвращенный элемент в выходной файл как новую строку). Это преобразовало бы вышеприведенное решение из «получить все строки в памяти как массив, отфильтровать их,
не может просто проверить, является ли 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 элемента.