C# DataRow所有项数组转换为单个字符串,每个数组后附加|

5
 DataTable tblData = new DataTable();
                MySQLProcessor.dtTable(pullDataQuery, out tblData);
                foreach (DataRow columnRow in tblData.Rows)
                {
                  //do string work here
                }

columnRow看起来像这样:
[0]苹果
[1]梨子
[2]芒果

我想将其转换为一个字符串,看起来像苹果|梨子|芒果
而无需在数组中进行foreach循环。

抱歉没有讲清楚,每个表格都有不同数量的数组项。

6个回答

6

尝试执行

object[] arr = new object[] {"1", "2" };
string joinedStr = string.Join("|",arr.Select(p => p.ToString()).ToArray());

所以,你的代码可以变成这样:
     DataTable tblData = new DataTable();
              string myStr = string.Empty; 
                    MySQLProcessor.dtTable(pullDataQuery, out tblData);
                    foreach (DataRow columnRow in tblData.Rows)
                    {
                      myStr = string.Join("|",columnRow.ItemArray.Select(p => p.ToString()).ToArray());
                      //do whatever you want
                    }

5
考虑使用 String.Join。首先需要提取所需的列值,可能需要...
var cols = row.ItemArray
    .Select(i => "" + i) // Not i.ToString() so when i is null -> ""
    .ToArray(); // For .NET35 and before, .NET4 Join takes IEnumerable

var res = string.Join("|", cols);

...或类似的技术。

愉快的编程!


0

Mike,你可以像这样做

string finalString=string.Empty;

foreach (DataRow columnRow in tblData.Rows)
                {
           finalString+=columnRow["ColumnName"]+"|";
                }
if(finalyString.length>0)
{
finalyString=finalString.Substring(0,finalString.length-1) // this removes extra "|" at the end
}

0
//Without Using LINQ. In case you use old DotNet (Eg.2.0)
string ArrToStr(DataRow r,string separator)
{
   string temp = "";
   Object[] o = r.ItemArray;
   foreach(Object oo in o)
   {
     temp += oo.ToString() + separator;
   }            
   return temp;
}
//So you can use like this.
string value="";
foreach (DataRow row in combine.Rows)
{
   value += ArrToStr(row, ",") ;
}

0

[编辑]:

你可以通过它的属性 ItemArray 获取 DataRow 的所有值。 ItemArray 是一个值类型为 object 的数组。

你可以将这个数组传递给函数 string.Join(),该函数使用指定的分隔符连接数组的所有元素。

要注意,如果你的 DataRow 中的任何列包含 DBNull.Value,函数 string.Join() 将隐式地将 DBNull.Value 转换为空字符串 ("")。因此,最终你可能会得到类似于 A||B 的结果。 为了避免这种情况,在我的示例中我使用了 LINQ 函数 Where() 来摆脱 DataRow 的空值,并通过使用 LINQ 函数 ToArray() 将其转换回数组。关于 DBNull.Value.ToString() 的更多信息,请参见 msdn source

在 foreach 循环中,你可以注意到我使用了美元符号 - $(特殊字符,用于标识插入字符串),用于字符串插值。

"字符串插值是评估包含一个或多个占位符的字符串字面量的过程,产生一个结果,其中占位符被替换为它们对应的值"

在这种情况下,占位符被包含在一对花括号 {} 中。 通过使用字符串插值,我摆脱了另一个用于连接字符串文字“\r\n”的加号运算符。
string str = "";
    
foreach (DataRow columnRow in tblData.Rows)
{
    str += $"{string.Join("|", columnRow.ItemArray.Where(val => val != DBNull.Value).ToArray())}\r\n";
}

社区通常不会接受没有解释的代码答案。 - The Fabio

-2

试试这个:

string record = columnRow[0].ToString() + "|" + columnRow[1].ToString() + "|" + columnRow[2].ToString();

如果有超过三个项目怎么办? - FIre Panda
抱歉造成困惑,请看我的编辑,每个表格都返回不同的数组。 - user222427
哎呀,为什么被踩了?我的回答是基于原始问题的,其中行有3列... - Tim
@Tim,我没有给你的回答投反对票,但是你的答案是硬编码的,如果有100行会发生什么?你应该一定要循环遍历他现有的循环,并使用“|”符号连接字符串。 - kobe
@Kobe - 你说得有道理。我只是简单地回答了发帖者的问题。他想避免在数组上进行foreach循环,但如果列数事先不知道,我看不到任何简单的方法可以避免某种形式的循环。我很好奇最终的答案是什么。 - Tim

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