asp.net Lambda表达式C#并集Where

yptwkmov  于 2022-12-15  发布在  .NET
关注(0)|答案(3)|浏览(173)

我有类的对象

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中有错误的所有人对象,并联合同一个p1中没有错误的所有人。
我需要类似上面代码的东西,但是它不起作用。我怎么能把它写在一个lambda子句中呢?
非常感谢?

fbcarpbf

fbcarpbf1#

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

您需要在.Union中添加第二个IEnumerable,并且不需要再次投影,因为对象已经是您需要的类型。
尽管在本例中没有实际意义,但结果与p1相同

fykwrbwg

fykwrbwg2#

好吧,我自己找到了解决办法,应该是这样的:

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

对不起,可能我的回答不是很清楚。谢谢大家的回复。

5fjcxozz

5fjcxozz3#

这将避免出现以下情况:有错误但姓名和年龄有值,或者没有错误但姓名和年龄没有值。
单独:

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

相关问题