IEnumerable 到用逗号分隔的字符串?
Posted
技术标签:
【中文标题】IEnumerable 到用逗号分隔的字符串?【英文标题】:IEnumerable to string delimited with commas? 【发布时间】:2011-03-25 18:19:09 【问题描述】:我有一个返回的 DataTable
IDs
,1
,2
,3
,4
,5
,100
,101
我想将其转换为单个字符串值,即:
,1,2,3,4,5,100,101
如何重写以下内容以获得单个字符串
var _values = _tbl.AsEnumerable().Select(x => x);
【问题讨论】:
看看这个msdn.microsoft.com/en-us/library/a8ycds2f%28VS.80%29.aspx 不清楚 - 什么数据被returned?你有DataRows和一列ID吗?此外,逗号存在混淆 - 它们是否可能存在于数据库中并且已经存在,还是应该添加它们? 感谢所有好心人Select(x => x);
完全没有意义,尤其是在你的情况下
这能回答你的问题吗? How to convert IEnumerable<string> to one comma separated string?
【参考方案1】:
var singleString = string.Join(",", _values.ToArray() );
【讨论】:
你需要在_values上调用ToArray()吗? 最简单的解决方案,我正要回答这个问题,但您需要在 _values 上添加 .ToArray()。 @ck 这完全取决于输入数据是什么。如果逗号已经在数据中,只需将","
替换为String.Empty
。
@ck 我想这是一个解释问题。我认为逗号是 OP 格式特有的,而不是数据的一部分。无论如何,string.Join
可能是达到预期结果的最简单方法。
在 .Net 4 Join
和 Concat
上使用 IEnumerable
,而您不需要 ToArray
。所以,这取决于。【参考方案2】:
写一个扩展方法如
public static String AppendAll(this IEnumerable<String> collection, String seperator)
using (var enumerator = collection.GetEnumerator())
if (!enumerator.MoveNext())
return String.Empty;
var builder = new StringBuilder().Append(enumerator.Current);
while (enumerator.MoveNext())
builder.Append(seperator).Append(enumerator.Current);
return builder.ToString();
并假设您之前的表达式的结果是 IEnumerable
var _values = _tbl.AsEnumerable().Select(x => x).AppendAll(String.Empty);
【讨论】:
为该扩展方法中的额外内容道歉 - 这是我经常使用的一种将字符串连接在一起的方法,适合这种情况。 以及为什么要投反对票 - 我知道其中可能不需要解决问题的额外内容,但它确实有效。 @Winston:我知道 String.Join。如果数据源是数组,我当然会使用它。 String.Join 需要一个数组,该数组必须完全保存在内存中。然后将数组复制到字符串,再次在内存中。因此,String.Join 的内存要求比我所写的要多,它按顺序逐个迭代项目并将它们附加到字符串中。 String.Join 是另一种涉及内存需求/复杂性权衡的方式。 Alex - 你对那个有点过时了:msdn.microsoft.com/en-us/library/dd992421.aspx。此外,现在考虑表演还为时过早,当然没有剖析。如果有问题的数据非常小,或者已经在数组中怎么办? @Kobi - 我只是在讨论潜在的权衡,以及为什么我的方法仍然有效。我想 String.Join 在 .NET 4.0 中采用可枚举的事实证明比我更聪明的人也同意。【参考方案3】: String.Join(
",",
_tbl.AsEnumerable()
.Select(r => r.Field<int>("ID").ToString())
.ToArray())
【讨论】:
【参考方案4】:试试这个:
var _values = _tbl.AsEnumerable().Select(x => x);
string valueString = _values.ToList().Aggregate((a, b) => a + b);
【讨论】:
您忘记了分隔符。 a + 分隔符 + b OP 不需要分隔符 +1 但是为什么这两个步骤并调用ToList
?为什么不只是_tbl.AsEnumerable().Select(x => x).Aggregate((a, b) => a + b);
?
理论上是正确的。事实上 - 一些错误。 Select(x => x)
没有意义,因为AsEnumerable()
已经制作了表格IEnumerable<DataRow
。 ToList()
没有意义,Aggregate()
是成员,如果 IEnumerable<T>
不是 List<T>
我在执行 _tbl.AsEnumerable().Select(x => x.Field您可以使用MoreLINQ 扩展名
var singleString = _values.ToDelimitedString(",");
【讨论】:
【参考方案6】:我对一般的Array
类型有类似的问题,我解决了如下
string GetMembersAsString(Array array)
return string.Join(",", array.OfType<object>());
请注意,呼叫OfType<object>()
是强制性的。
【讨论】:
【参考方案7】:你可以这样作弊:
String output = "";
_tbl.AsEnumerable().Select(x => output += x).ToArray();
// output now contains concatenated string
需要注意ToArray()
或类似内容才能强制执行查询。
另一种选择是
String output = String.Concat(_tbl.AsEnumerable().Select(x=>x).ToArray());
【讨论】:
@Winston - 不需要分隔符,请重新阅读问题。 第二个选项:String output = String.Concat(_tbl.AsEnumerable().ToArray());
也会这样做,不是吗? (没有Select
)以上是关于IEnumerable 到用逗号分隔的字符串?的主要内容,如果未能解决你的问题,请参考以下文章
db2 对字符串进行分隔(分隔符为逗号),并计算分隔得到的数组的长度,不写自定义函数,如何做到?