C# 将LINQ数据行字符串放入数组,然后放入字符串列表

C# 将LINQ数据行字符串放入数组,然后放入字符串列表,c#,linq,C#,Linq,我有一些代码将在DataRows上循环,并将DataRow中以管道分隔的列拆分为一个数组,然后再拆分为一个列表 使用LINQ有更好的方法吗?我试过了,但没有成功 List<string> allSizes = new List<string>(); foreach (DataRow resultRow in results.Rows) { if (resultRow["Sizes"] != DBNull.Value) { string[]

我有一些代码将在
DataRow
s上循环,并将
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);
            }
        }
    }
}
List allsize=new List();
foreach(results.Rows中的DataRow resultRow)
{
if(resultRow[“size”]!=DBNull.Value)
{
string[]size=resultRow[“size”].ToString().Split(“|”);
foreach(字符串大小以大小为单位)
{
如果(!allsize.Contains(size))
{
所有尺寸。添加(尺寸);
}
}
}
}
var allsize=results.Rows.Cast()
.Where(行=>行[“大小”!=DBNull.Value)
.SelectMany(row=>row[“size”].ToString().Split(“|”))
.Distinct()
.ToList();

这是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);
}
var allsize=new List();
弗雷奇(
字符串大小
在results.Rows中从DataRow resultRow
其中resultRow[“size”!=DBNull.Value
选择resultRow[“Sizes”]。ToString()。将(“|”)拆分为大小
从尺寸中的尺寸,其中!allsize.Contains(尺寸)
选择大小){
所有尺寸。添加(尺寸);
}
类似这样的东西

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
将包含与变量
allsize
相同的元素

dt.Rows.OfType<DataRow>().Where(r => r["Sizes"] != DBNull.Value)
      .SelectMany(r=>r.Field<string>("Sizes").Split('|')
      .Distinct().ToList();
dt.Rows.OfType()。其中(r=>r[“size”]!=DBNull.Value)
.SelectMany(r=>r.Field(“大小”).Split(“|”)
.Distinct().ToList();

请注意,在列表中使用
Contains
并不是特别有效。考虑到数据集可能会变大,并且您检查每个项目是否在列表中,这可能会很昂贵。最好使用基于集合的数据结构来执行
不同的
,这就是您正在做的,一个以及LINQ
Distinct
方法的作用。扩展方法看起来更好:)+1正如OP所指出的,在大小不一般的
列表
上执行包含操作不是一个便宜的操作;您应该将项目放入基于集合的数据结构中,以执行不同的操作。
dt.Rows.OfType<DataRow>().Where(r => r["Sizes"] != DBNull.Value)
      .SelectMany(r=>r.Field<string>("Sizes").Split('|')
      .Distinct().ToList();