需要linq查询吗
我在列表中有3个字段name、Code、displayname,这里我需要得到一个列表作为输出,其中我得到了所有字段,但需要按冒号拆分displayname字段,然后为每个拆分的值(displayname)再次添加列表。 因此,在输出列表中,我将有5行,因为总显示名是2行中的5行。 此问题需要linq查询 名称代码显示名称 餐巾和餐具-餐巾和餐具-3层:传统餐巾 手巾-手和毛巾-2层:毛巾卷:彩色 输出应如下所示: 名称代码显示名称 餐巾和餐具-餐巾和餐具-3层 餐巾和餐具-餐巾和餐具-传统餐巾 手巾-手和毛巾-2层 手巾-手和毛巾-毛巾卷 手巾-手和毛巾-彩色 我在C中尝试的解决方案需要linq查询吗,linq,c#-4.0,Linq,C# 4.0,我在列表中有3个字段name、Code、displayname,这里我需要得到一个列表作为输出,其中我得到了所有字段,但需要按冒号拆分displayname字段,然后为每个拆分的值(displayname)再次添加列表。 因此,在输出列表中,我将有5行,因为总显示名是2行中的5行。 此问题需要linq查询 名称代码显示名称 餐巾和餐具-餐巾和餐具-3层:传统餐巾 手巾-手和毛巾-2层:毛巾卷:彩色 输出应如下所示: 名称代码显示名称 餐巾和餐具-餐巾和餐具-3层 餐巾和餐具-餐巾和餐具-传统餐巾
如果您要转换为LINQ,当您有嵌套的foreach循环,这些循环对应于查询语法或点语法中的“from”子句时,后续的循环将变成SelectMany,请参见下文。以下内容应接近您想要的内容:
var query =
from qs in CategoryProductList()
from friendlyName in qs.displayName.Split(':')
select new ProductDetailsWithFilters(qs.Code, qs.Category, friendlyName);
注意:因为函数式编程应该没有副作用,所以选择新实例ProductDetailsWithFilters比修改查询中的现有实例要好。我的假设是,您可以调用构造函数来构建其中的一个新构造函数
要像循环实现那样修改现有属性,必须迭代结果——LINQ在框架中不提供这样的功能。这种副作用常常导致难以发现的bug
要使用SelectMany和dot语法执行与上述查询等效的操作,请执行以下操作:
var query = CategoryProductList()
.SelectMany(
qs => qs.DisplayName.Split(':'),
(qs, friendlyName) => new ProductDetailsWithFilters(qs.Code, qs.Category, friendlyName));
两者都会产生功能相同的代码。在本例中,我倾向于使用查询语法而不是点语法,部分原因是存在多个SelectMany重载,处理投影涉及在两个lambda表达式中重复变量。如果要添加另一个from,则查询语法将隐藏“透明标识符”的管理,否则必须在点语法等效代码中处理这些标识符。不管你喜欢什么,现在两者都有了
值得注意的是,查询是懒惰的——在您迭代查询结果之前,它们什么都不做。因此,这里的结果是非常有趣的部分—存储它。ToList,直接将数据绑定到UI,使用它为web API提供服务,等等。到目前为止,您到底做了哪些尝试,哪些不起作用?我正在尝试针对显示名称执行每个循环,拆分displayname,然后用每个拆分的值在新变量中分配整个列表。好的,向我们展示您尝试过的代码,并告诉我们什么不起作用…但我不想用于每个C,我只需要通过linq实现。因为c代码将变得非常复杂,如果我使用Linq,那么它将非常健壮和简单。如果它像你说的那样简单,你应该能够生成它。
var query = CategoryProductList()
.SelectMany(
qs => qs.DisplayName.Split(':'),
(qs, friendlyName) => new ProductDetailsWithFilters(qs.Code, qs.Category, friendlyName));