Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将List.foreach替换为LINQ_C#_.net_Linq - Fatal编程技术网

C# 将List.foreach替换为LINQ

C# 将List.foreach替换为LINQ,c#,.net,linq,C#,.net,Linq,我是LINQ的新手,正在用它做一些实验 对不起,如果是复制品,我似乎找不到合适的指南 我要替换此代码: DataTable table List<string> header = new List<string>(); table.Columns.Cast<DataColumn>().ToList().ForEach(col => header.Add(col.ColumnName)); 但它甚至没有编译。 我想要的不是一行解决方案,而是一些逻辑,以了

我是LINQ的新手,正在用它做一些实验

对不起,如果是复制品,我似乎找不到合适的指南

我要替换此代码:

DataTable table
List<string> header = new List<string>();
table.Columns.Cast<DataColumn>().ToList().ForEach(col => header.Add(col.ColumnName));
但它甚至没有编译。
我想要的不是一行解决方案,而是一些逻辑,以了解如何在更复杂的环境中构建它(例如,使用一些逻辑选择XML中的多个节点)

您可以使用以下方法:

var header = table.Columns.Cast<DataColumn>().Aggregate(new List<string>(), (list, col) => { list.Add(col.ColumnName); return list; });
var header=table.Columns.Cast().Aggregate(new List(),(List,col)=>{List.Add(col.ColumnName);return List;});

通常,Linq允许从数据源检索和转换数据序列。在这个问题中,您要做的是迭代序列并返回即时结果。这不是Linq的主要关注点,但是有一些方法可以执行,包括
Aggregate()
Average()
Count()
Max()
,等等。

为什么不简单地选择这样的方法呢

DataTable table;
IEnumerable<string> header = from mycol in table.Columns.Cast<DataColumn>()
                             select mycol.ColumnName;
DataTable;
IEnumerable header=来自表.Columns.Cast()中的mycl
选择mycol.ColumnName;
这将不会编译,因为在
数据表
中没有像
那样的属性,只有
,您必须使用
.Cast()
方法,因为它们没有实现正确的接口(请参见@Uriil的答案)

试试这个:

var LINQheader = from mycol in table.Columns.Cast<DataColumn>()
                  select mycol.ColumnName;
LINQheader.tolist();
var LINQheader=来自表.Columns.Cast()中的mycl
选择mycol.ColumnName;
LINQheader.tolist();
如果要在扩展方法中使用wrap,可以如下所示:

public static IEnumerable<string> GetHeaderColumns (this DataTable dataTable) 
{
    if (dataTable == null || !dataTable.Columns.Any())
    {
        yield break;
    }
    foreach (var col in dataTable.Columns.Cast<DataColumn>())
    {
        yield return col.ColumnName;
    }
}
公共静态IEnumerable GetHeaderColumns(此数据表)
{
if(dataTable==null | |!dataTable.Columns.Any())
{
屈服断裂;
}
foreach(dataTable.Columns.Cast()中的var col)
{
返回col.ColumnName;
}
}
这里有一个小代码示例。如果您想成为
列表
,请使用
ToList()

编辑:

比如@Grundy说您缺少指定col的类型,即DataColumn

List<string> columnList = (from DataColumn mycol in table.Columns select mycol.ColumnName).ToList();
List columnList=(从表中的DataColumn mycl.Columns中选择mycl.ColumnName.ToList();

这是您的一行。

您有一些问题,需要解决:

  • ForEach是列表特定的方法,因此无法将其转换为LINQ
  • LINQ用于数据选择、聚合,但不用于数据 修改
  • table.Columns
    ,返回不包含 实现
    IEnumerable
    ,因此您必须强制转换它:

    var LINQheader = from mycol in table.Columns.Cast<DataColumn>()
                     select name.ColumnName;
    
    var LINQheader=来自表.Columns.Cast()中的mycl
    选择name.ColumnName;
    

  • 这是原始代码

    table.Columns.Cast<DataColumn>().ToList().ForEach(col => header.Add(col.ColumnName));
    
    你也可以用这个

    table.Columns.Cast<DataColumn>()
        .ToList()
        .ForEach(col =>
        {
            if (col.ColumnName.StartsWith("Id"))
                header.Add(col.ColumnName)
        });
    
    table.Columns.Cast()
    托利斯先生()
    .ForEach(列=>
    {
    if(col.ColumnName.StartsWith(“Id”))
    header.Add(col.ColumnName)
    });
    

    var headers=table.Columns.Cast()
    .Where(col=>col.ColumnName.StartsWith(“Id”))
    .选择(列=>列名称);
    header.AddRange(headers);
    
    我想要的不是一行解决方案,而是一些逻辑来理解如何用更复杂的environments@dotctor-你是警察吗?如果你能解释一下你想做什么,也许我能帮上更多的忙。我刚刚为你粘贴了一部分作品,我想让你帮助那个提出问题的人,我认为理解
    Aggregate
    比理解
    ForEach
    @dotctor更难你说的更难是什么意思?这不是为什么它没有编译你的linq语句中有
    表。列而不是
    表。列
    ?@DoctorMick当然你是对的,这只是一个打字错误(我没有从代码中复制它,而是在问题中重写了它)编辑了问题它仍然无法编译,因为Linq区分大小写,请参见我的答案。@VMAtm您是对的,我会编辑它。但是这里的问题不是关于语法,所以它不那么重要:)@LordTitika您能提供编译错误吗?因为它真的很混乱,到底什么东西没有编译。为了更一致,还可以将它作为DataTable的扩展方法来实现:-)@Grundy是的,大人!扩展方法必须是静态函数中的静态函数classes@dotctor是的,添加了
    static
    关键字。请在您的答案中添加代码,因为您在select子句P中为
    col
    变量指定了类型
    DataColumn
    ,我也这样认为:-)实际上答案是好的,但您的答案(我认为)更多的信息和背后的逻辑
    var LINQheader = from mycol in table.Columns.Cast<DataColumn>()
                     select name.ColumnName;
    
    table.Columns.Cast<DataColumn>().ToList().ForEach(col => header.Add(col.ColumnName));
    
    DataTable table = new DataTable();
    List<string> header = new List<string>();
    
    foreach (DataColumn col in table.Columns)
    {
        if (col.ColumnName.StartsWith("Id")) // you can remove this line if you want to add all of them
           header.Add(col.ColumnName);
    }
    
    table.Columns.Cast<DataColumn>()
        .ToList()
        .ForEach(col =>
        {
            if (col.ColumnName.StartsWith("Id"))
                header.Add(col.ColumnName)
        });
    
    var headers = table.Columns.Cast<DataColumn>()
            .Where(col => col.ColumnName.StartsWith("Id"))
            .Select(col => col.ColumnName);
    
    header.AddRange(headers);