Lambda表达式C#Union在哪里

时间:2015-09-25 17:36:03

标签: 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" }, 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子句中编写它?

非常感谢?

3 个答案:

答案 0 :(得分:6)

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

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

虽然在这种情况下有点没有实际意义,但结果与p1相同

答案 1 :(得分:1)

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

独立的:

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

答案 2 :(得分: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();

对不起,也许我的答案不太清楚。 谢谢大家的回复。