Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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
需要linq查询吗_Linq_C# 4.0 - Fatal编程技术网

需要linq查询吗

需要linq查询吗,linq,c#-4.0,Linq,C# 4.0,我在列表中有3个字段name、Code、displayname,这里我需要得到一个列表作为输出,其中我得到了所有字段,但需要按冒号拆分displayname字段,然后为每个拆分的值(displayname)再次添加列表。 因此,在输出列表中,我将有5行,因为总显示名是2行中的5行。 此问题需要linq查询 名称代码显示名称 餐巾和餐具-餐巾和餐具-3层:传统餐巾 手巾-手和毛巾-2层:毛巾卷:彩色 输出应如下所示: 名称代码显示名称 餐巾和餐具-餐巾和餐具-3层 餐巾和餐具-餐巾和餐具-传统餐巾

我在列表中有3个字段name、Code、displayname,这里我需要得到一个列表作为输出,其中我得到了所有字段,但需要按冒号拆分displayname字段,然后为每个拆分的值(displayname)再次添加列表。 因此,在输出列表中,我将有5行,因为总显示名是2行中的5行。 此问题需要linq查询

名称代码显示名称

餐巾和餐具-餐巾和餐具-3层:传统餐巾

手巾-手和毛巾-2层:毛巾卷:彩色

输出应如下所示:

名称代码显示名称

餐巾和餐具-餐巾和餐具-3层

餐巾和餐具-餐巾和餐具-传统餐巾

手巾-手和毛巾-2层

手巾-手和毛巾-毛巾卷

手巾-手和毛巾-彩色

我在C中尝试的解决方案
如果您要转换为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));