Посмотрите на этот вопрос
Существует ссылка на эту статью: неверно понятый мьютекс , где объясняется использование мьютекса.
var stuff = from l in File.ReadAllLines(filename)
let x = l.Split(new [] {',', ' '}, StringSplitOptions.RemoveEmptyEntries)
.Skip(1)
.Select(s => int.Parse(s))
select new
{
Sum = x.Sum(),
Average = x.Average()
};
Если вы читаете большие файлы и использование памяти вызывает беспокойство, то с помощью .NET 4 будет лучше работать следующее:
var stuff = from l in File.ReadLines(filename)
let x = l.Split(new [] {',', ' '}, StringSplitOptions.RemoveEmptyEntries)
.Skip(1)
.Select(s => int.Parse(s))
select new
{
Sum = x.Sum(),
Average = x.Average()
};
В обоих случаях переменная stuff
содержит перечислимое, которое фактически не будет выполнено, пока вы не начнете читать из него (например, внутри цикла foreach
).
Я только что обнаружил библиотеку LinqToCsv, она выполняет все операции разбора, а затем вы можете запрашивать объекты, такие как коллекции, и она поддерживает отложенное чтение:
http://www.codeproject.com/Articles / 25133 / LINQ к CSV-библиотеки
Что-то вроде этого может быть:
var csv = @"A, 22, 23, 12
B, 32, 4, 33
C, 34, 3 ,33";
var lines =
csv.Split('\n').Select(x => x.Split(',').Skip(1).Select(n => int.Parse(n))).Select(x => new {Sum = x.Sum(), Average = x.Average()});
foreach (var line in lines)
{
Console.WriteLine("Sum: " + line.Sum);
Console.WriteLine("Average: " + line.Average);
}
В общем, я не предлагаю делать что-то подобное. Вы должны использовать полнофункциональный CSV-ридер для анализа CSV-файла, и вам следует включить обработку ошибок.
На самом деле в большинстве случаев вам следует избегать расщепления на основе ','
только потому, что в строке может быть кома.
Я даю вам лучшее универсальное решение с использованием Regex и простое в использовании:
var stuff = File.ReadAllLines(csvFilePath)
.Skip(1) // For header
.Select(s => Regex.Match(s, @"^(.*?),(.*?),(.*?),(.*?),(.*?)$"))
.Select(data => new
{
Foo = data.Groups[1].Value,
Bar = data.Groups[2].Value,
One = data.Groups[3].Value,
Two = data.Groups[4].Value,
});
И вы можете найти более подробную информацию здесь https://stackoverflow.com/a/18147076/196526