使用简单的 LINQ 风格的扩展方法来显示或格式化列表/集合/数组。






4.75/5 (3投票s)
本文提供并描述了 EnumerableExt 类,该类简化了列表、集合和数组的显示和格式化。它通过实现可通过 IEnumerable 接口使用的扩展方法(Append、BuildString 和 Write)来实现这一点。
引言
我经常发现自己需要编写代码来显示或格式化列表、集合或数组。最常见的情况是简单地显示一个逗号分隔的列表,例如:item-1, item-2, item-3。有时,需求会更复杂一些。
本文介绍了一个(EnumerableExt
)类,它可以简化这项任务的复杂性。该类实现为 IEnumerable<T>
接口的一组扩展方法(Append
、BuildString
、Write
)。
由于几乎所有列表、集合和数组都实现了这个接口,这些方法通过扩展方法的魔力变得可用。
背景
最近,我一直在大量使用 LINQ,并享受它为 IEnumerable<T>
接口提供的出色扩展方法。我突然想到,进一步扩展该接口以包含一些方法,从长远来看,可以使我的生活更轻松,这相对简单。
这是编写此代码的主要动机。我在这里发布它,以防其他人也能从中受益。本文包含以下源文件:
- EnumerableExt.cs - 这是您利用这些新扩展方法所需的 **唯一** 文件。
- Program.cs - 这个控制台程序只是演示了
EnumerableExt
类的一些功能。 - EnumerableExtTests.cs - 此文件可在测试项目中使用,以测试
EnumerableExt
类的功能。
虽然了解 LINQ、扩展方法和 lambda 表达式对于使用此代码不是必需的,但我强烈建议学习 C# 语言的这些有用功能。在本文的结尾,我将提供一些供进一步阅读的链接。
使用代码
要使用此代码,只需将 EnumerableExt.cs 包含在您的解决方案中。在消耗这些方法的类中,您需要添加以下 using 语句使其可见:
using Extended.Linq;
出于演示目的,在我们的示例中,我们创建了一个简单的字符串数组,如下所示:
string[] list = new string[]{"Red", "Green", "Blue", "White", "Black"};
要将此数组作为逗号分隔的列表写入控制台,操作非常简单:
list.Write(Console.Out);
结果输出(到控制台)如下所示:
Red, Green, Blue, White, Black
扩展方法
由于这对我来说总有点像魔法,所以我将花一点时间来描述发生了什么。如果您已经熟悉扩展方法,请随意跳过。事实上,在这种情况下,您可能只想阅读 Program.cs 以更快地了解如何使用某些选项。
通过扩展方法,C# 为该语言引入了一个强大的新工具。通过编写一个静态类,其中包含静态方法,并将第一个参数用 "this" 关键字装饰,您就可以创建一个扩展方法。
C# 编译器和 IntelliSense 足够智能,可以使这些方法对与该参数类型相同(或派生类型)的所有类可见。参数类型可以是类、结构或接口。
在我们的例子中,参数类型是 IEnumerable<T>
。因此,这些扩展方法会神奇地对实现该接口的任何内容可见。在我们的示例中,它们对字符串数组可见。
更多关于使用代码
每个方法,例如 Write
,都提供了许多重载,以便包含或省略可选参数。这是一个稍微复杂一些的写入示例:
list.Write(Console.Out, EnumerableExt.WriteDoubleQuote, " or ", element => element.ToUpper());
在这种情况下,输出如下所示:
"RED" or "GREEN" or "BLUE" or "WHITE" or "BLACK"
此调用的参数如下:
- writer - 用于写入输出的
TextWriter
。在我们的例子中,我们指定了Console.Out
来写入控制台。 - elementWriter - 用于将单个元素写入输出的
ElementWriter
(来自EnumerableExt
的委托)。在我们的例子中,我们指定了EnumerableExt.WriteDoubleQuote
。此方法是EnumerableExt
类的一个便捷方法,它将元素用双引号括起来。EnumerableExt.WriteSingleQuote
方法也可用。如果这两种方法都不满足您的要求,您也可以轻松编写自己的方法。 - separator - 用于分隔列表中单个元素的字符序列。在我们的例子中,我们指定了字符串 " or "。
- selector - 用于选择单个元素的函数。在我们的例子中,我们指定了一个 lambda 表达式,它只是将元素转换为大写。如果您不熟悉 lambda 表达式的语法,本文末尾提供了一个链接供您进一步阅读。
使用代码构建字符串
除了 Write
方法之外,还提供了两个非常相似的方法来构建字符串:Append
和 BuildString
。Append
方法将内容追加到预先存在的 StringBuilder
;而 BuildString
方法创建自己的 StringBuilder
,代表您调用 Append
,并返回结果字符串。
与 Write 方法一样,这些方法提供了许多重载,以便您可以包含或省略可选参数。由于这些方法与 Write
非常相似,我们将仅为每种方法演示最复杂的方法签名。
请放心,您 **不需要** 提供此处演示的所有参数。Program.cs 文件演示了每种方法的简单情况。
以下是一个使用 Append
所有参数的调用示例:
list.Append(builder, EnumerableExt.AppendSingleQuote, " and ", element => element.ToLower());
您会注意到参数几乎与 Write
相同,只是用 StringBuilder
替换了 TextWriter
,用 ElementAppender
替换了 ElementWriter
。
它将以下文本追加到 StringBuilder
:
'red' and 'green' and 'blue' and 'white' and 'black'
以下是一个使用 BuildString 所有参数的调用示例:
string colors = list.BuildString(1024, EnumerableExt.AppendDoubleQuote, ":",
element => element.ToUpper());
您会注意到参数几乎与 Append
相同,只是用初始容量(1024 个字符)替换了 StringBuilder
。它返回一个包含以下文本的字符串:
"RED":"GREEN":"BLUE":"WHITE":"BLACK"
关注点
虽然代码相对简单且易于实现,但我发现它很有用。我希望您,读者,也能如此。
以下阅读材料可能有助于您进一步理解本文中提到的一些主题:
历史
虽然我不打算对本文进行大量修改,但还是在此列出其历史记录,以防万一:
- 2013 年 5 月 10 日 - 这是本文的原始版本。