2017-02-27 63 views
1

我有一個列表約。 120,000個物體。從這個列表中我想提取數據來創建人員訂閱對象。邏輯是,1人可以有1個或更多的報紙訂閱。LINQ查詢與if-statment

我正在努力如何編寫一個Linq查詢,只添加一個新的Person對象,如果它尚未被創建。在僞代碼一樣是這樣的:

persons.Select(x => 

if (PersonIsAdded(x)) 
{ 
    var person = GetPerson(x); 
    person.Address = "XXX"; 
    person.SubscriptionList.Add{new subscription() {Name = "newspaperName} 
} 
else 
{ 
    new Person{ Address = "XYZ", SubscriptionList.Add{new subscription() {Name =  
    "newspaperName"} } 
).ToList(); 
+0

這不是創建這些對象的方式。你需要一個'GroupBy'並在一個查詢中創建整個批次。你可以顯示代碼pelase的其餘部分,以便我們可以給你一個很好的解決方案嗎? – Enigmativity

+0

如果您發佈實際有效的C#代碼,這也會很棒。一些我們可以用很少的努力就可以合作的東西。 – Enigmativity

+0

這是否有必要成爲LinQ的原因?你能先建立一個'foreach'循環嗎?與複製LinQ語句相比,它對你的理解肯定更好。 – nvoigt

回答

0

如果我理解正確的問題,你可以不喜歡

var person = persons.FirstOrDefault(x => x.Id == yourId); 

if (person == null) 
{ 
    // create new person with subscription 
} 
else 
{ 
    person.SubscriptionList.Add(subscription) 
} 

這是假設你有一個標識符,鑑於你的個人目標

0

您向我們顯示的代碼(忽略複雜的ObjectMapper),那麼我建議您的代碼看起來像這樣:

persons.Select(x => 
{ 
    if (PersonIsAdded(x)) 
    { 
     var person = GetPerson(x); 
     person.Address = "XXX"; 
     person.SubscriptionList.Add(
      new subscription() { Name = "newspaperName " }); 
     return person; 
    } 
    else 
    { 
     return new Person() 
     { 
      Address = "XYZ", 
      SubscriptionList = new [] 
      { 
       new subscription() { Name = "newspaperName" } 
      }.ToList(), 
     } 
    } 
}).ToList(); 

但是,這似乎是錯誤的。您的代碼應該能夠像這樣簡單的東西:

List<Person> query = 
(
    from x in persons 
    join n in subscriptions on x equals n.Id into subs 
    select new Person() 
    { 
     Address = x.Address, 
     SubscriptionList = 
      subs 
       .Select(y => new subscription() { Name = n.Name }) 
       .ToList(), 
    } 
).ToList(); 

但你有沒有給我們詳細適量,以確保這是正確與否。

+0

我寫的第一個例子就是我寫的僞代碼。我不想爲人物中的每個對象創建人物對象。如果以前沒有添加過人物對象,我只想創建一個人物對象。我認爲,通過聲明集體可以在這裏有所幫助。 – Kran

+0

@Kran - 問題被標記爲C# - 不使用僞代碼,除非你很清楚這是你的意圖。但是,這會減少嘗試回答的人數。 – Enigmativity