Linq中的数据库数据行

时间:2014-01-30 12:26:59

标签: .net linq datatable linq-to-objects

我有一个数据表,其列为column1,它包含许多行,就像

rows[0]=1001000
rows[1]=1000001

等; 我想要实现的是使用LINQ.ie将空间转换为0;预期的结果将是

rows[0]=1  4   
rows[1]=1     7     

等;

我有一个linq代码用于汇总不同的colums然后执行该功能。但我想在一行中进行计算。我的代码是

var rows = dtFilter.AsEnumerable()
    .Select(row => 
        string.Join("",
            dtFilter.Columns.Cast<DataColumn>()
               .Select(col => row.Field<string>(col) == "0" ? " " : (col.Ordinal + 1).ToString()))
    )
    .ToList();

2 个答案:

答案 0 :(得分:1)

从每行的第一列中选​​择值,然后用空格替换零并将结果转换为列表:

List<string> result = dtFilter.AsEnumerable()
                              .Select(r => r.Field<string>(0))
                              .Select(s => s.Replace("0", " "))
                              .ToList();

答案 1 :(得分:1)

类似的东西

var elements = new []{"1001000", "1000001"};

var result = elements
             .Select(m => string.Join("", m.Select((x, i) => (x == '1' ? (i+1).ToString() :" "))));

所以使用您的代码

var result = dtFilter
                .AsEnumerable()
                .Select(r => r.Field<string>(0))
                .Select(s => string.Join("", 
                                     s.Select((x, i) => x == '1' 
                                                        ? (i+1).ToString()
                                                        : " "))
                 );

如果需要,最后添加一点.ToList()

修改

第二次选择中发生了什么:

当您对字符串执行Select时,它会投射到IEnumerable<char>

然后,Select超载,其中selector参数为Func<TSource, Int32, TResult>Func的第二个参数表示源元素的索引。

因此,对于字符串中的每个字符,我们都会

如果它等于1,则获取字符串中char的索引(+1,从0开始)。我们可以使用Func的第二个参数(在这种情况下为i,而x代表char)

否则,请获得一个空白区域。

因此IEnumerable<char>中的每个字符都以这种方式计算。

现在,我们已经有了IEnumerable<char>我们的“变形人物”。

我们在string.Join上执行IEnumerable<char>以获取字符串。