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子句中?
非常感谢?
好了,找到解决自己的,它应该是这样的:
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
*也许* OP需要投影,以防止具有名称和错误的人(他们将失去名称)。 –
我需要在声明中创建新的Person对象:c => new Person {Name = c.Name,Age = c.Age}或new Person {Error = d.Error}取决于错误状态 – ihorko
换句话说,我需要: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();
这实际上并不是我需要的,因为\t 我需要在声明中创建新的Person对象:c => new Person {Name = c。 Name,Age = c.Age}或新的Person {Error = d.Error},具体取决于错误状态,以及union/concat它们 – ihorko
这是你想要正确的语法查询吗? '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();' –
'但它不工作'为什么? – usr
如果你从'p1'中选择了所有'p1'中有'Error'和'Union'的所有人,那么''没有错误',你将得到p1。 :) –