2017-02-27 7 views
1

私には約1のリストがあります。 120,000のオブジェクト。このリストから、Person och Subscriptionオブジェクトを作成するためのデータを抽出します。論理は、1人が1つ以上の新聞購読を持つことができるということです。if-statmentを使用したLINQクエリ

新しいPersonオブジェクトがまだ作成されていない場合にのみ追加するLinqクエリを書く方法に苦労しています。このような擬似のようなコードなものでは:私が正しく質問を理解していれば

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'を必要とし、単一のクエリで全体を作成します。コード・ペーストの残りの部分を表示して、良い解決策を提供できますか? – 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) 
} 

ような何かを行うことができます複雑なものを無視して私たちに示したコード(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

私が与えた最初の例は、私が書いたように、擬似コードでした。私は人間のオブジェクトごとにpersonオブジェクトを作成したくない。以前に追加されたことのない人物オブジェクトを作成したいだけです。グループ声明はここで役立つと思います。 – Kran

+0

@Kran - 質問はC#とタグ付けされました。あなたの意図であることが明確でない限り疑似コードを使用しません。しかし、それは答えようとする人の数を減らすでしょう。 – Enigmativity

関連する問題