Lambda expression C# Union Where

本文关键字:Where Union expression Lambda | 更新日期: 2023-09-27 18:14:44

我有一个类

的对象
public class Person
    {
        public string Error { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
    }

有的有Error(没有Name和Age)有的没有Error(没有Name和Age)

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中所有有错误的person对象,并将相同p1中所有没有错误的person合并。

我需要类似于上面的代码,但它不工作。我怎么把它写在一个lambda子句里?

谢谢你?

Lambda expression C# Union Where

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

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

虽然在这种情况下没有实际意义,但结果与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();
对不起,也许我的回答不太清楚。谢谢大家的回复。

这将避免出现出现错误但是Name和Age有值或者没有错误但是Name和Age没有值的情况。

单独

:

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