65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.75/5 (3投票s)

2013年5月10日

CPOL

5分钟阅读

viewsIcon

15039

downloadIcon

220

本文提供并描述了 EnumerableExt 类,该类简化了列表、集合和数组的显示和格式化。它通过实现可通过 IEnumerable 接口使用的扩展方法(Append、BuildString 和 Write)来实现这一点。

引言

我经常发现自己需要编写代码来显示或格式化列表、集合或数组。最常见的情况是简单地显示一个逗号分隔的列表,例如:item-1, item-2, item-3。有时,需求会更复杂一些。

本文介绍了一个(EnumerableExt)类,它可以简化这项任务的复杂性。该类实现为 IEnumerable<T> 接口的一组扩展方法(AppendBuildStringWrite)。

由于几乎所有列表、集合和数组都实现了这个接口,这些方法通过扩展方法的魔力变得可用。

背景

最近,我一直在大量使用 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 方法之外,还提供了两个非常相似的方法来构建字符串:AppendBuildStringAppend 方法将内容追加到预先存在的 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 日 - 这是本文的原始版本。
© . All rights reserved.