2012-07-11 64 views
3

我怎樣才能使這一獨特的工作:的不同之處在Linq查詢

var blockIdMap = (from panelEntry in panelEntries 
          select new {panelEntry.BlockNo, panelEntry.BlockID}) 
          .Distinct() 
          .ToDictionary(mc => mc.BlockNo , mc => mc.BlockID); 

我需要有塊編號與它的塊標識,因爲我進入他們字典和塊編號應該是唯一的只有唯一條目。 我只想採取第一個。

+0

你總是可以''GroupBy'和BlockNo'然後選擇''First' BlockID'。唯一能夠改變'Distinct'的方法是使用'IEqualityComparer''或者使用一個實現'IEquatable '的類並且重載'GetHashCode'。你不能用匿名類型來完成前者,而且他們對於被鎖定的後者有自己的實現。 – 2012-07-11 11:31:16

+0

@AdamHouldsworth - [編譯器覆蓋GetHashCode和等於匿名類型](http://stackoverflow.com/a/543591/219661) – Jamiec 2012-07-11 11:34:47

+0

@Jamiec我知道,我修改了我的評論,指出你不能將實現更改爲我的初稿不準確。默認實現將考慮所有屬性,而不僅僅是'BlockNo'。 – 2012-07-11 11:35:54

回答

6
var blockIdMap = panelEntries.GroupBy(pe => pe.BlockNo) 
      .ToDictionary(k => k.Key, v => v.First()) 
1

在這種情況下,您的LINQ查詢不工作怎麼一回事,因爲.Distinct()方法等於panelEntry.BlockNopanelEntry.BlockID不僅panelEntry.BlockNo。因此,一個解決方案是使用MoreLinq和方法.DistinctBy()

var blockIdMap = (from panelEntry in panelEntries 
       select new {panelEntry.BlockNo, panelEntry.BlockID}) 
       .DistinctBy(mc => mc.BlockNo) 
       .ToDictionary(mc => mc.BlockNo , mc => mc.BlockID);