C# Lambda表达式C并集在哪里

C# Lambda表达式C并集在哪里,c#,asp.net,linq,lambda,C#,Asp.net,Linq,Lambda,我有类的对象 public class Person { public string Error { get; set; } public string Name { get; set; } public int Age { get; set; } } 有些有错误,没有名字和年龄,有些没有错误,没有名字和年龄 Person[] p1 = new Person[] { new Person { Error = "Error1" },

我有类的对象

public class Person
    {
        public string Error { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
    }
有些有错误,没有名字和年龄,有些没有错误,没有名字和年龄

Person[] p1 = new Person[] { new Person { Error = "Error1" }, new Person { Name = "Name1", Age = 1 } };



Person[] p2 = p1
                .Where(c => string.IsNullOrEmpty(c.Error))
                .Select(
                    c => new Person { Name = c.Name, Age = c.Age }
                 ).ToArray()
                 Union()
                .Where(d => !string.IsNullOrEmpty(d.Error))
                .Select(
                    d => new Person { Error = d.Error }
                 ).ToArray()
我需要创建第二个数组p2,在这里我可以选择p1中有错误的所有persons对象,并合并同一p1中没有错误的所有persons对象

我需要类似上面代码中的东西,但它不起作用。我怎样才能把它写在一个lambda子句中

多谢了

p1.Where(c => string.IsNullOrEmpty(c.Error))
                 .Union(p1.Where(d => !string.IsNullOrEmpty(d.Error)))
                .ToArray()
您需要在.Union中添加第二个IEnumberable。无需再次投影,因为对象已经是您需要的类型

虽然在这种情况下这是一种模拟,但结果与p1相同

您需要在.Union中添加第二个IEnumberable。无需再次投影,因为对象已经是您需要的类型


虽然在这种情况下没有什么意义,但结果与p1相同,这将避免出现有错误但名称和年龄有值或没有错误但名称和年龄没有值的情况

分开:

var p1Err = p1.Where(p => String.IsNullOrEmpty(p.Error) && !String.IsNullOrEmpty(p.Name) 
                   && !String.IsNullOrEmpty(p.Age));
var p1NoErr = p1.Where(p => !String.IsNullOrEmpty(p.Error) && String.IsNullOrEmpty(p.Name) 
                    && String.IsNullOrEmpty(p.Age));

var p2 = p1Err.Union(p1NoErr)
              .ToArray();
合并:

var p2 = p1.Where(p => String.IsNullOrEmpty(p.Error) && !String.IsNullOrEmpty(p.Name) 
                   && !String.IsNullOrEmpty(p.Age))
           .Union(p1.Where(ip => !String.IsNullOrEmpty(ip.Error) 
                   && String.IsNullOrEmpty(ip.Name) && String.IsNullOrEmpty(ip.Age)))
           .ToArray();

这将避免出现有错误但名称和年龄有值或没有错误但名称和年龄没有值的情况

分开:

var p1Err = p1.Where(p => String.IsNullOrEmpty(p.Error) && !String.IsNullOrEmpty(p.Name) 
                   && !String.IsNullOrEmpty(p.Age));
var p1NoErr = p1.Where(p => !String.IsNullOrEmpty(p.Error) && String.IsNullOrEmpty(p.Name) 
                    && String.IsNullOrEmpty(p.Age));

var p2 = p1Err.Union(p1NoErr)
              .ToArray();
合并:

var p2 = p1.Where(p => String.IsNullOrEmpty(p.Error) && !String.IsNullOrEmpty(p.Name) 
                   && !String.IsNullOrEmpty(p.Age))
           .Union(p1.Where(ip => !String.IsNullOrEmpty(ip.Error) 
                   && String.IsNullOrEmpty(ip.Name) && String.IsNullOrEmpty(ip.Age)))
           .ToArray();

好的,我自己找到了解决方案,应该是这样的:

Person[] p2 = p1
            .Where(c => string.IsNullOrEmpty(c.Error))
            .Select(
                c => new Person { Name = c.Name, Age = c.Age }
             )
            .Union(
            p1.Where(d => !string.IsNullOrEmpty(d.Error))
            .Select(
                d => new Person { Error = d.Error }
             )
             ).ToArray();
对不起,也许我的答案不太清楚。
谢谢大家的回复。

好的,我自己找到了解决方案,应该是这样的:

Person[] p2 = p1
            .Where(c => string.IsNullOrEmpty(c.Error))
            .Select(
                c => new Person { Name = c.Name, Age = c.Age }
             )
            .Union(
            p1.Where(d => !string.IsNullOrEmpty(d.Error))
            .Select(
                d => new Person { Error = d.Error }
             )
             ).ToArray();
对不起,也许我的答案不太清楚。
谢谢大家的回复。

这是您想要的语法正确的查询吗?Person[]p2=p1.Wherec=>string.IsNullOrEmptyc.Error.Selectc=>newperson{Name=c.Name,Age=c.Age}.Unionp1.Whered=>!string.IsNullOrEmptyd.Error.Selectd=>newperson{Error=d.Error}.ToArray;但它不起作用为什么会这样?如果您从p1中选择所有有错误的人员,并与p1中所有没有错误的人员联合,您将得到p1:是的,我需要相同的结果p1,这只是一个例子,实际中有xml输入,这是您想要的具有正确语法的查询吗?Person[]p2=p1.Wherec=>string.IsNullOrEmptyc.Error.Selectc=>newperson{Name=c.Name,Age=c.Age}.Unionp1.Whered=>!string.IsNullOrEmptyd.Error.Selectd=>newperson{Error=d.Error}.ToArray;但它不起作用为什么会这样?如果您从p1中选择所有有错误的人员,并与p1中所有没有错误的人员联合,您将得到p1:是的,我需要相同的结果p1,这只是一个例子,实际中有xml输入可能OP需要投影,以防止同时有名字和错误的人丢失名字。我需要在语句中创建新的Person对象:c=>new Person{Name=c.Name,Age=c.Age}或new Person{Error=d.Error}根据错误状态,换句话说,我需要如下内容:if string.IsNullOrEmptyp1[I].Error{list.Addnew Person{Name=p[I].Name,Age=p[I].Age}else{list.Addnew Person{Error=p[I].Error},因此在list new Person objects中,OP可能需要投影,为了防止同时具有姓名和错误的人员丢失姓名。我需要在语句中创建新的人员对象:c=>new Person{Name=c.Name,Age=c.Age}或new Person{Error=d.Error},具体取决于错误状态,换句话说,我需要类似这样的内容:if string.IsNullOrEmptyp1[I].Error{list.Addnew Person{Name=p[I].Name,Age=p[i].Age}else{list.Addnew Person{Error=p[i].Error},所以在list new Person objects中这实际上不是我需要的,因为我需要在语句中创建new Person对象:c=>new Person{Name=c.Name,Age=c.Age}或new Person{Error=d.Error},具体取决于错误状态,而union/concat them这实际上不是我需要的,因为我需要在语句中创建新的Person对象:c=>newperson{Name=c.Name,Age=c.Age}或newperson{Error=d.Error},具体取决于错误状态,然后union/concat它们