我喜欢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)
我要求两件事:
先感谢您!
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)
但是,我更喜欢原始查询的可读性:)
| 归档时间: |
|
| 查看次数: |
3541 次 |
| 最近记录: |