C# 将List.foreach替换为LINQ
我是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)); 但它甚至没有编译。 我想要的不是一行解决方案,而是一些逻辑,以了
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();
这是您的一行。您有一些问题,需要解决:
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);