【问题标题】:In C# Convert List<dynamic> to List<string>在 C# 中将 List<dynamic> 转换为 List<string>
【发布时间】:2021-06-09 00:59:02
【问题描述】:

假设我有一个包含字符串的List&lt;dynamic&gt; 对象:

var dlist = new List<dynamic>()
{
    "test",
    "test2",
    "test3"
};

是否有任何有效的方法可以将其转换为正确的 List&lt;string&gt; 对象?我知道我可以遍历这个列表并将每个元素转换为一个字符串,然后将其添加到结果列表中,但也许一些 Linq 魔法可以在一行中完成?

我尝试将Select()ToList()Cast&lt;string&gt; 结合使用,但无济于事。这应该如何正确完成?

注意:我所说的“高效”当然是指代码行数。我不考虑执行时间或性能。另外 - 假设我不需要输入检查,只有在这个动态列表中才会有字符串。

编辑:好的,关于“为什么 Cast 不适合你”的 cmets - 看起来我收到的数据有另一个问题(我正在使用 Dapper),这就是它不起作用的原因.很抱歉造成混淆,我认为我的列表转换有误,而问题与此无关。

【问题讨论】:

  • dlist.Cast&lt;string&gt;().ToList(); 应该可以。
  • 既然知道类型,为什么还要使用dynamic
  • 我很想知道您所说的“但无济于事”是什么意思。发生了什么?
  • TimSchmelter:编辑帖子以添加对“效率”的说明。 @HimBromBeere 我从其他来源收到此列表,它不依赖于我。
  • 您仍然没有弄清楚“不起作用”是什么意思。实际上你在这个问题上的问题是什么?

标签: c#


【解决方案1】:

给定

var dList = new List<dynamic>() { /*...initialize list */ };

如果您有兴趣提取集合中的所有字符串,忽略所有其他类型,可以使用:

// Solution 1: Include only strings, no null values, no exceptions thrown
var strings = dlist.OfType<string>().ToList();

如果您确定列表中的所有项目都是字符串(如果不是,则会抛出异常),您可以使用:

// Solution 2: Include strings with null values, Exception for other data types thrown
var strings = dlist.Cast<string>().ToList();

如果您想要列表中所有项目的默认字符串表示形式,null 代表 null 值,您可以使用:

// Solution 3: Include all, regardless of data type, no exceptions thrown
var strings = dlist.Select(item => item?.ToString()).ToList();

【讨论】:

  • dlist.Cast&lt;string&gt;()。但是由于 OP 已经尝试过,知道为什么它不起作用会很有趣。如果列表中还有 OP 未提及的其他类型,OfType 就会派上用场。
  • @TimSchmelter 请参阅我的“编辑”部分。我附加了一些关于我为什么出错的说明 - 看起来我正在寻找解决方案 X,而问题是 Y。
  • @Camilo Terevinto,我可能错了,但我觉得解释不够清楚。 OfType() 将返回集合中所有“装箱”字符串的未装箱版本,而忽略任何其他类型,而 Cast 假定它们都是装箱字符串
  • @AlexC。装箱/拆箱适用于objects,而不是dynamics。但是,您是正确的,OfType 将仅返回实际的 strings,而如果存在非 string 值,Cast 将失败
  • 好答案。让我补充一点:解决方案 1 只返回项目(如果它们是字符串),将抑制空值和数字。解决方案 2 包含 null 值,但如果有数字则会引发异常,解决方案 3 适用于所有内容,包括 null 值和数字(使用 LinqPad 6 使用 .NET 核心进行测试)。
【解决方案2】:

此答案适用于dart/flutter

给定

List<dynamic> dList;

你可以使用

var sList = List<String>.from(dlist);

List&lt;dynamic&gt; 转换为List&lt;String&gt;

【讨论】:

  • .from(...) 对我不起作用。我在 LinqPad 中尝试过。有什么遗漏吗? (使用...)
  • 好久没解析了,完全忘记了!谢谢!!!哈哈,它在 C# 部分,这是 dart 语法,它把我带到了这里!!!难怪它有这么多赞成票,可能来自 dart/flutter 人。
  • @serg 我收到了error CS0117: 'List&lt;string&gt;' does not contain a definition for 'from'
猜你喜欢
  • 2021-05-20
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-27
  • 2020-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多