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 =&gt; 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 JoinConcat 上使用 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 =&gt; x).Aggregate((a, b) =&gt; a + b); 理论上是正确的。事实上 - 一些错误。 Select(x =&gt; x) 没有意义,因为AsEnumerable() 已经制作了表格IEnumerable&lt;DataRowToList() 没有意义,Aggregate() 是成员,如果 IEnumerable&lt;T&gt; 不是 List&lt;T&gt; 我在执行 _tbl.AsEnumerable().Select(x => x.Field(columnName)).Aggregate((a, b) => a + b) 时得到了结果(我正在研究类型化数据集)【参考方案5】:

您可以使用MoreLINQ 扩展名

var singleString = _values.ToDelimitedString(",");

【讨论】:

【参考方案6】:

我对一般的Array 类型有类似的问题,我解决了如下

string GetMembersAsString(Array array)

    return string.Join(",", array.OfType<object>());

请注意,呼叫OfType&lt;object&gt;() 是强制性的。

【讨论】:

【参考方案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 到用逗号分隔的字符串?的主要内容,如果未能解决你的问题,请参考以下文章

从IEnumerable创建逗号分隔的列表

Angularjs小数分隔符逗号

将逗号分隔值转换为双引号逗号分隔字符串

db2 对字符串进行分隔(分隔符为逗号),并计算分隔得到的数组的长度,不写自定义函数,如何做到?

ActionScript 3 AS3修剪逗号分隔字符串(例如,用户输入的逗号分隔关键字列表)

SQL拆分逗号分隔的字符串