2017-02-27 44 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