2017-04-03 97 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

用備用建議更新了答案,然後是非常難看,不推薦的單行解決方案。 –

相關問題