2017-04-03 102 views
0

在我的应用程序中,我有一个'PortalItemTag'对象列表。 PortalItemTag将门户,项目和标签关联在一起。我被要求采用属于每个PortalItemTag对象的PortalItemTagTypeId并将该值复制到Tag对象上的PortalItemTagTypeId属性。如何通过值将项目列表中的项目分配给新对象?

作为参考,一个PortalItemTag对象由一个门户对象,一个Item对象,一个Tag对象和一些附加属性组成。

当我将每个属性分配给标签时,我意识到我的标签列表已通过引用分配给了PortalItems。 foreach循环内的第一行代码执行此操作。

而不是创建一个对Tag对象的引用,我想分配一个Tag对象的新实例。是否有捷径可寻?

 foreach (var portalItemTag in portalItemTags) 
     { 
      var tag = _tags.FirstOrDefault(_ => _.Id == portalItemTag.TagId); 

      portalItemTag.Tag = tag; 

      if (portalItemTag.Tag != null) 
       portalItemTag.Tag.PortalItemTagTypeId = portalItemTag.PortalItemTagTypeId; 
     } 

退出上面的循环后,我想看到两个记录具有相同的标记,但不同的PortalItemTagTypeId's。

PortalItemTag - Object 1 
PortalId: 1 
ItemId: 1 
PortalItemTagTypeId: 1 
Tag: 
{ 
Id:1 
Name: Sample Tag 
PortalItemTagTypeId:1 
} 

PortalItemTag - Object 2 
PortalId: 1 
ItemId: 1 
PortalItemTagTypeId: 2 
Tag: 
{ 
Id:1 
Name: Sample Tag 
PortalItemTagTypeId:2 
} 

然而,此刻的最后分配赢,因为我引用标记对象,并改变他PortalItemTagTypeId引用的对象,改变它都PortalItemTags上。

有没有人有任何想法,这可能会实现而没有太多的痛苦?我试图避免实施'克隆()'方法,但会这样做,如果它是唯一的方法...

在此先感谢!

为了清楚起见编辑样本对象。

+0

什么是在上面的代码中的_tags'? –

+0

您声明您希望“获取属于每个”PortalItemTag“对象的'PortalItemTagTypeId'并将该值复制到'Tag'对象上的'PortalItemTagTypeId'属性,但您的示例'PortalItemTag'对象没有一个单独的'PortalItemTagTypeId'属性。 –

+0

_tags是一个标签列表。每个标签都有一个Id和一个What列。 – Zoop

回答

1

所以你想更新portalItemTag.PortalItemTagTypeId并添加一个新的Tag具有相同的值到portalItemTag对象?

这应该工作:

foreach (var portalItemTag in portalItemTags) 
{ 
    // Get the tag that matches this portalItemTag.TagId 
    var tag = _tags.FirstOrDefault(_ => _.Id == portalItemTag.TagId); 

    // If it's not null, copy the tag to this object 
    // and update it's PortalItemTagTypeId property 
    if (tag != null) 
    { 
     // Create a new tag and copy the property values from the other tag to this one 
     var newTag = new Tag 
      { 
       Id = tag.Id, 
       Name = tag.Name, 
       PortalItemTagTypeId = tag.PortalItemTagTypeId 
      }; 

     portalItemTag.PortalItemTagTypeId = tag.PortalItemTagTypeId; 
     portalItemTag.Tag = newTag; 
    } 
} 

如果你在不同的地方这样做,或者Tag对象的属性可能发生变化,这可能是值得的执行你的Tag类本身就是一个Clone方法。它看起来是这样的:

class Tag 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int PortalItemTagTypeId { get; set; } 

    public Tag Clone() 
    { 
     return new Tag { Id = Id, Name = Name, 
      PortalItemTagTypeId = PortalItemTagTypeId }; 
    } 
} 

然后你foreach代码将被简化为:

foreach (var portalItemTag in portalItemTags) 
{ 
    var tag = _tags.FirstOrDefault(_ => _.Id == portalItemTag.TagId); 

    if (tag != null) 
    { 
     portalItemTag.PortalItemTagTypeId = tag.PortalItemTagTypeId; 
     portalItemTag.Tag = tag.Clone(); 
    } 
} 

您在您的评论,你想要做一个行中提到。虽然它可能很有趣,看起来很酷,但如果出现问题,对其他人来说,阅读或调试将会很痛苦,但这里有一种方法可以实现它(使用上述的克隆方法)。请注意,在这个混乱中有两个任务正在进行,第二个任务是基于第一个任务的结果。但一目了然,它看起来只是一个任务正在发生:

foreach (var portalItemTag in portalItemTags) 
{ 
    portalItemTag.PortalItemTagTypeId = 
     (portalItemTag.Tag = _tags.Any(t => t.Id == portalItemTag.TagId) 
      ? _tags.First(t => t.Id == portalItemTag.TagId).Clone() 
      : default(Tag)) != default(Tag) 
       ? portalItemTag.Tag.PortalItemTagTypeId 
       : portalItemTag.PortalItemTagTypeId; 
} 
+0

谢谢,我刚刚写了一些非常类似的东西,然后再回来检查: var tempTag = _tags.FirstOrDefault(_ => _.Id == portalItemTag.TagId); var tag = new Tag(); tag.Id = tempTag.Id; tag.What = tempTag.What; 我很好奇,如果有一种方法将两者结合成一个linq语句;但这是一个不同的问题! – Zoop

+0

用备用建议更新了答案,然后是非常难看,不推荐的单行解决方案。 –

相关问题