Lambda表达式C#联盟在哪里

Lambda表达式C#联盟在哪里

问题描述:

我的类的对象Lambda表达式C#联盟在哪里

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中选择所有具有Error的人员对象,并联合来自同一个p1且没有错误的所有人员。

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

非常感谢?

+0

这是你想要正确的语法查询吗? '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();' –

+0

'但它不工作'为什么? – usr

+0

如果你从'p1'中选择了所有'p1'中有'Error'和'Union'的所有人,那么''没有错误',你将得到p1。 :) –

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

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(); 

对不起,也许我的回答是说不清楚的。 感谢所有的答复。

p1.Where(c => string.IsNullOrEmpty(c.Error)) 
       .Union(p1.Where(d => !string.IsNullOrEmpty(d.Error))) 
       .ToArray() 

您需要在.Union内添加第二个IEnumberable。因为对象已经是您需要的类型,所以不需要重新投影。

虽然它是一种在这种情况下没有实际意义的,结果是一样的p1

+1

*也许* OP需要投影,以防止具有名称和错误的人(他们将失去名称)。 –

+0

我需要在声明中创建新的Person对象:c => new Person {Name = c.Name,Age = c.Age}或new Person {Error = d.Error}取决于错误状态 – ihorko

+0

换句话说,我需要:if(string.IsNullOrEmpty(p1 [i] .Error)){list.Add(new Person {Name = p [i] .Name,Age = p [i] .Age})} else {list.Add(new Person {Error = p [i] .Error}},所以在列表中新的Person对象 – ihorko

这将避免那里有一个错误的情况,但姓名和年龄有价值观,如果没有错误,但名字和年龄别没有价值。

独立:

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(); 
+0

这实际上并不是我需要的,因为\t 我需要在声明中创建新的Person对象:c => new Person {Name = c。 Name,Age = c.Age}或新的Person {Error = d.Error},具体取决于错误状态,以及union/concat它们 – ihorko