gpt4 book ai didi

C# LINQ 三元运算符作为 foreach 内的 switchcase

转载 作者:行者123 更新时间:2023-12-02 15:50:38 26 4
gpt4 key购买 nike

我正在使用 LINQ 和 HtmlAgilitypack 从 HTML 创建数据表。下面获取 html 表头并构造数据表列:

var nodes = htmlDoc.DocumentNode.SelectNodes("//table[@class='ps-sellers-table crts']/tr");
nodes[0].Elements("th")
.Skip(0)
.Select(th => th.InnerText
.Trim())
.ToList()
.ForEach(header => dt.Columns.Add(header));

到目前为止,它工作得很好,除了我需要一些定制。

  1. 选择要添加的列。
  2. 并指定列类型。

此 select 语句将执行上述两件事:

switch (header)
{
case ("id") : dt.Columns.Add(header,typeof(int)); break;
case ("name") : dt.Columns.Add(header,typeof(string)); break;
case ("price") : dt.Columns.Add(header,typeof(decimal)); break;
case ("shipping") : dt.Columns.Add(header,typeof(decimal)); break;
default : //skip the column and dont add it
}

但是我对 LINQ 和 C# 确实很陌生,我想在第一个代码段中的 foreach 内实现上述 switch case,我知道我应该使用三元运算符,但我不确定关于语法。

最佳答案

我会将 switch 包装到一个方法中,然后从 select 语句中调用该方法。

我的版本看起来像:

var nodes = htmlDoc.DocumentNode.SelectNodes("//table[@class='ps-sellers-table crts']/tr");
nodes[0].Elements("th")
.Select(th => th.InnerText.Trim());

foreach(var node in nodes)
AddColumnToDataTable(node, dt);

请注意,无需 Skip(0) ,并调用 ToList()只是为了使用List<T>.ForEach降低可读性并增加开销。我个人更喜欢使用普通的 foreach .

话虽如此,您的方法可以重构为使用 Dictionary<string, Type>反而。如果您将其添加到您的类(class)中:

Dictionary<string, Type> typeLookup;
// In your constructor:

public YourClass()
{
typeLookup.Add("id", typeof(int));
typeLookup.Add("name", typeof(string));
typeLookup.Add("price", typeof(decimal));
typeLookup.Add("shipping", typeof(decimal));
}

然后您可以将您的方法编写为:

void AddColumnToDataTable(string columnName, DataTable table)
{
table.Columns.Add(columnName, typeLookup[columnName]);
}

关于C# LINQ 三元运算符作为 foreach 内的 switchcase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15233934/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com