2015-09-25 79 views
-2

我的類的對象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。 :) –

回答

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

對不起,也許我的回答是說不清楚的。 感謝所有的答覆。

6
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

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

這實際上並不是我需要的,因爲\t 我需要在聲明中創建新的Person對象:c => new Person {Name = c。 Name,Age = c.Age}或新的Person {Error = d.Error},具體取決於錯誤狀態,以及union/concat它們 – ihorko