Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.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

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
C# 合并IEnumerable的问题<;T>;使用Lambda表达式_C#_Linq_Ienumerable_Linq To Objects - Fatal编程技术网

C# 合并IEnumerable的问题<;T>;使用Lambda表达式

C# 合并IEnumerable的问题<;T>;使用Lambda表达式,c#,linq,ienumerable,linq-to-objects,C#,Linq,Ienumerable,Linq To Objects,我有两个IEnumerables类型为“产品”-totalProducts和ProductsChosen。正如名称所示,totalProducts保存所有可用产品,ProductsChosen保存用户选择的产品 产品类具有属性Id、number和IEnumerable < P>此代码只有在考虑产品ID时才能正常工作,但如果产品ID相同,则我想将产品代码> >代码< >产品> 。但是我不确定如何做到这一点。 谁能帮我一下吗 感谢,因为所选产品具有不同的选项,即总产品必须是不同的实例。既然您已经说

我有两个IEnumerables类型为“产品”-totalProducts和ProductsChosen。正如名称所示,totalProducts保存所有可用产品,ProductsChosen保存用户选择的产品

产品类具有属性
Id
number
IEnumerable

< P>此代码只有在考虑产品ID时才能正常工作,但如果产品ID相同,则我想将<代码>产品代码> <代码> >代码< >产品> <代码>。但是我不确定如何做到这一点。 谁能帮我一下吗


感谢

,因为所选产品具有不同的选项,即总产品必须是不同的实例。既然您已经说过,所有产品都是可用的,那么我假设所选产品ID的集合必须是产品ID的子集

此外,由于选择的产品是不同的实例,因此每个总产品可能有零个或多个选择的产品,因此我的解决方案也适用于这种情况。如果只有零或一个,它将同样有效

此外,由于它们是不同的实例,
options
属性是一个
IEnumerable
,因此我有必要为合并产品创建一组新的实例,以避免更改原始的总产品集

public IEnumerable<Product> MergeProducts(
    IEnumerable<Product> Products,
    IEnumerable<Product> ProductsChosen)
{
    return
        from p in Products
        join pc in ProductsChosen on p.Id equals pc.Id into pcs
        select new Product()
        {
            Id = p.Id,
            number = p.number,
            options = p.options
                .Concat(
                    from pc2 in pcs
                    from ao in pc2.options
                    select ao).ToArray(),
        };
}
公共IEnumerable合并产品(
i数不清的产品,
IEnumerable products(Schosen)
{
返回
产品中的p
将pc加入产品p.Id上的Schosen等于pc.Id加入pc
选择新产品()
{
Id=p.Id,
数字=p.number,
选项=p.options
康卡特先生(
从pc2到pcs
来自pc2.options中的ao
选择ao).ToArray(),
};
}
您没有解释什么是
number
属性,所以我只是对
Products
列表中的这个值做了一个简单的赋值,并忽略了
ProductsChosen
列表中的这个值

另外,您没有说明如何合并
附加选项。这不是可枚举项的
Merge
方法。您需要使用类似于
Concat
Union
的方法进行合并。我选择了
Concat
,但这很容易改变


这对你有用吗?

改用
Union()
方法-虽然concat是公认的答案,但正如你从投票中看到的,Union更倾向于改进标签列表以吸引更多的观众。我认为这个问题需要澄清。我的解释是,您正在查找两个
产品集合的并集
,在
产品的交集
上,您希望在该结果中找到
附加选项的并集
。对吗?
public IEnumerable<Product> MergeProducts(
    IEnumerable<Product> Products,
    IEnumerable<Product> ProductsChosen)
{
    return
        from p in Products
        join pc in ProductsChosen on p.Id equals pc.Id into pcs
        select new Product()
        {
            Id = p.Id,
            number = p.number,
            options = p.options
                .Concat(
                    from pc2 in pcs
                    from ao in pc2.options
                    select ao).ToArray(),
        };
}