2012-10-22 29 views
2

我有一些代码将循环DataRow s和将DataRow中的管道分隔列分成一个数组,然后到List<string>LINQ datarow字符串到数组,然后进入字符串列表

有没有更好的方法来使用LINQ来做到这一点?我试过了,但没有任何意义!

List<string> allSizes = new List<string>(); 

foreach (DataRow resultRow in results.Rows) 
{ 
    if (resultRow["Sizes"] != DBNull.Value) 
    { 
     string[] sizes = resultRow["Sizes"].ToString().Split('|'); 
     foreach (string size in sizes) 
     { 
      if (!allSizes.Contains(size)) 
      { 
       allSizes.Add(size); 
      } 
     } 
    } 
} 
+0

注意,使用'Contains'上的列表不是特别有效。考虑到数据集很可能会变大,并且您检查它是否在列表中,或者不在每个项目中,这可能会变得昂贵。最好使用基于集合的数据结构来执行“Distinct”,这就是你正在做的事情,以及LINQ'Distinct'方法的作用。 – Servy

回答

8
var allSizes = results.Rows.Cast<DataRow>() 
    .Where(row => row["Sizes"] != DBNull.Value) 
    .SelectMany(row => row["Sizes"].ToString().Split('|')) 
    .Distinct() 
    .ToList(); 
+0

你赢了...... :(+1 – Pluc

+0

扩展方法看起来好多了:) +1 – Laurence

0

这里是LINQ的版本,但我个人不干净得多找到它:

var allSizes = new List<string>(); 

foreach (
    string size in 
    from DataRow resultRow in results.Rows 
    where resultRow["Sizes"] != DBNull.Value 
    select resultRow["Sizes"].ToString().Split('|') into sizes 
    from size in sizes where !allSizes.Contains(size) 
    select size) { 
    allSizes.Add(size); 
} 
+1

正如OP所说,在非平凡大小的'List'上执行一个包含并不是一个便宜的操作;您应该将这些项目放入基于集合的数据结构中以执行区分。 – Servy

+0

很高兴知道,谢谢。 – Laurence

0

这样的事情。

var linqSizes = 
    from row in results.Rows 
    where row["Sizes"] != DBNull.Value 
    let sizes = row["Sizes"].ToString().Split('|') 
    from size in sizes 
    group size by size into g 
    select g.Key; 

变量linqSizes将包含相同的元素,您的变量allSizes

0

强类型的DataRow和LINQ:

dt.Rows.OfType<DataRow>().Where(r => r["Sizes"] != DBNull.Value) 
     .SelectMany(r=>r.Field<string>("Sizes").Split('|') 
     .Distinct().ToList(); 
相关问题