2015-05-23 214 views
1

我从下面的数据表列中选取不同的值。将列表值分割成逗号分隔的字符串

var uniqueCC = dtNew.AsEnumerable().Select(s => new { cc = s.Field<string>("ID"), }).Distinct().ToList(); 
var uniqueCode = dtNew.AsEnumerable().Select(s => new { Code = s.Field<string>("EAI"), }).Distinct().ToList(); 

现在我需要单独获取逗号分隔的字符串中的值,我使用下面的代码,它不单独使用该值。

string strCC = String.Join(",", uniqueCC); 
string strEAI = String.Join(",", uniqueCode); 

请提供一些建议。

值列表

cc=1, cc=2, cc=3 

预期结果

1,2,3 
+0

上面的代码会给你带来什么结果? –

回答

2

你可以使用LINQ Select()方法传递仅String.Join()

string strCC = String.Join(",", uniqueCC.Select(o => o.cc)); 

或者只是返回,而不是摆在首位匿名类型的字符串值:

var uniqueCC = dtNew.AsEnumerable().Select(s => s.Field<string>("ID")).Distinct(); 
string strCC = String.Join(",", uniqueCC); 
+0

好的,当我想出我的答案时,我甚至没有发现那些是匿名类型。 –

1

您可以使用C#提供aggregate功能。

假设您有一个名为listOfString的字符串列表,那么您可以像这样调用聚合函数。

string outString = listOfString.Aggregate((a, b) => a + "," + b); 

它会做的。

0

由于这是har07优秀的答案的延伸,如果这是你做了很多时间的事情,为了节省编写大量的代码,你可以把它作为一个静态的扩展方法来实现,在那里你通过da tatype,列名和您所需的分隔符 - 因此它可以处理不同的列数据类型和分隔符 - 在一个单独的文件:

namespace Extensions 
    { 
     public static class LinqExtensions 
     { 
      public static String ReturnSeparatedString<T>(this DataTable datatable, string field, string separator) 
      { 
       var unique = 
        datatable.AsEnumerable() 
         .Select(s => new {cc = s.Field<string>(field),}).Distinct(); 

       return String.Join(separator, unique.Select(o => o.cc)); 
      } 
    } 
} 

然后从你的代码通过创建到新Extensions.LinqExtensions类的引用调用它,并直接在dataTable上调用它,如下所示:

var commaSeparatedIds = dataTable.ReturnSeparatedString<string>("ID",","); 
    var commaSeparatedEAIs = dataTable.ReturnSeparatedString<string>("EAI",","); 
    var commaSeparatedInts = dataTable.ReturnSeparatedString<int>("MYINTS",","); 
    var dotSeparatedStrings = dataTable.ReturnSeparatedString<int>("OtherId", ".");