使用哲学?这是您可以在其他地方应用的一般答案。
阅读一些工具有用的例子。如果您发现自己缺乏使用该工具的理由,因为您永远不会出现类似的示例,那么请忘记它。它可能不适用于您的域。
如果您操作的所有数据都在 RDBMS 中,那么您可能根本不需要 Linq to Objects。
另一方面...您可能将其视为对数据库中的数据进行一些额外操作的一种方式,因此错过了加强代码表现力的机会,而这无关紧要处理数据库。
示例:您正在读取一个由纯文本行组成的文件。
var lines = File.ReadAllLines(fileName);
碰巧,lines 现在包含一个字符串数组,但数组支持 IEnumerable,因此我们可以对它们使用 Linq 方法。假设您要删除其中没有任何内容的行:
var nonBlankLines = lines.Where(line => line.Trim() == string.Empty);
假设您想要引号中的那些字符串(天真的实现 - 需要转义现有引号!):
var quoted = lines.Where(line => line.Trim() == string.Empty)
.Select(line => "\"" + line + "\"");
(我喜欢将连续的操作排列在一起,点法相互对齐。)
除非我要对这些线条做其他事情,否则我会这样做:
var quoted = File.ReadAllLines(fileName)
.Where(line => line.Trim() == string.Empty)
.Select(line => "\"" + line + "\"");
然后假设我希望这一切都变成一个用逗号分隔的字符串,如果我先把它全部变成一个数组,那么字符串中有一个名为 Join 的方法可以做到这一点:
var quoted = string.Join(", ",
File.ReadAllLines(fileName)
.Where(line => line.Trim() == string.Empty)
.Select(line => "\"" + line + "\"")
.ToArray());
或者我们可以使用 Linqy 的方式来做:
var quoted = File.ReadAllLines(fileName)
.Where(line => line.Trim() == string.Empty)
.Select(line => "\"" + line + "\"")
.Aggregate((a, b) => a + ", " + b);
此外,填补一些空白也没什么大不了的,因为在这些空白处你发现没有现有的运算符来满足你的需要(尽管有时事实证明已经有一个)。缺少一个大的与Aggregate 相反,我已将其称为Util.Generate:
IEnumerable<T> Generate<T>(T item, Func<T, T> generator)
{
for (; item != null; item = generator(item))
yield return item;
}
当您有一个链表时,这会非常方便,这种链表偶尔会出现在对象模型中。一个例子是Exception.InnerException,它允许异常形成一个链表,最里面的一个在最后。假设我们只想显示来自x 最内层异常的消息:
MessageBox.Show(Util.Generate(x, i => i.InnerException).Last().Message);
Generate 辅助方法将链表转换为 IEnumerable,允许其他 Linq 方法对其进行处理。只需要给它一个 lambda 来告诉它如何从当前项到达下一项。
也许这会让您入门,或者您可能需要更多示例,或者您可能从不操作任何非来自 RDBMS 的数据。