将十进制列表转换为以分隔符(',')分隔的字符串

4

我有一个IList<Decimal>,我想将它转换为用逗号隔开的字符串。

我尝试过将mrps作为十进制数的列表

var mrpstring = string.Join<string>(",", mrps.Cast<string>().ToList());

抛出异常:“无法将类型为'System.Double'的对象转换为类型'System.String'”

有什么解决方案吗?


尝试使用以下代码:var mrpstring = string.Join<string>(",", Convert.ToString(mrps).ToList()); - Max
我已经编辑了你的标题。请参考“问题的标题应该包含“标签”吗?”,在那里达成共识是“不应该”。 - John Saunders
@JohnSaunders 谢谢提醒,以后会注意的。 - Nitin Varpe
6个回答

6

string.Join<T> 方法会自动对 IEnumerable<T> 参数中的每个元素调用 ToString 方法,无需调用 ToList。所以这样做是可行的:

var mrpstring = string.Join(",", mrps);

不适用于所有文化,因为它隐式地使用IEnumerable中每个值的ToString,并将十进制格式化为特定于文化的格式,例如,'0.1'变成了"0,1"。 - MichaC
@MichaC 很明显这并不是一个要求。可能OP清楚知道将在哪种文化下运行此应用程序,因此这不是一个问题。很可能OP刚开始学习C#编程,并且这是一个练手的程序,所以OP在这个阶段可能不需要考虑本地化的问题。 - p.s.w.g
最简单的解决方案就是最好的吗? ;) 十进制字符串格式化是一个常见的问题,所以你应该始终注意它... - MichaC
在生产环境中,当然是这样。事实上,我有时会在面试过程中提出这种问题,只是为了确保候选人意识到它的存在。指出这一点是值得的,但似乎并不是这个问题的核心。 - p.s.w.g

3
使用ToString()方法而不是强制转换来将decimal类型转换成string类型。由于string.Join方法已经有一个重载可以接受IEnumerable<T>类型并使用ToString()方法,所以您可以直接传递您的IList<decimal>
var mrpstring = string.Join(",", mrps);

3
请使用Select代替:

mrps.Select(d => d.ToString())

根据错误提示,double类型的数据不能直接转换成string类型。因此,完整的代码可能如下所示:

var mrpstring = string.Join(",", mrps.Select(d => d.ToString()).ToList());

3
使用 SELECT 和 JOIN。
var result = string.Join(",", mrps.Select(p => p.ToString()));

请记住,.ToString()方法使用CurrentCulture格式化字符串。例如在德国,这将把逗号用作小数点,结果将是0,01,0,02...

使用此方法确保始终使用小数点。

var result = string.Join(",", mrps.Select(p => p.ToString(CultureInfo.InvariantCulture)));

由于使用了“InvariantCulture”选项,所以点赞。请注意,根据您的实际文化背景,小数分隔符可能会有所不同! - Gonzo345

2

看起来mrps是一个double类型的列表,而不是字符串列表。因此,请确保您将其转换为正确的类型:

var mrpstring = string.Join<string>(
    ",", 
    mrps.Cast<double>().Select(x => x.ToString()).ToList()
);

0

使用 Select

string.Join(",", mrps.Select(d => d.ToString()).ToArray());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接