2015-09-28 62 views
0

我想弄清楚如何從一個列表中選擇不同的值,然後將這些不同的值轉置到另一個列表。將一個列表的部分組合到另一個列表LINQ

我有這樣的:

型號:

public class Participant 
{ 
    public int UserId { get; set; } 
    public string Name { get; set; } 
} 

控制器代碼:

List<Participant> participants = new List<Participant>(); 
participants = project 
    .QuickView 
    .Select(x => new Participant { x.UserId, x.FullName}) 
    .Distinct() 
    .ToList(); 

這似乎讓我在不同的值的用戶ID和全名,但不能在列表格式,我需要。我得到一個IEnumerable格式不是列表格式。我錯過了什麼讓LINQ將結果放入新的參與者列表?

+2

您的代碼不編譯。你得到什麼格式?你想要什麼格式? – Blorgbeard

+0

除非我遺漏了一些東西,這是[C#distinct不起作用]的標準情況(https://www.bing.com/search?q=c%23+distinct+does+not+work) - 覆蓋了很多這樣的問題 - 即http://stackoverflow.com/questions/1365748/distinct-not-working-with-linq-to-objects。如果不是這樣,請澄清該帖子,以便可以重新打開。 –

+0

要將IEnumerable 轉換爲列表,請使用ToList ()。另外:爲了使Distinct()能夠按需要工作,請確保完全按照您希望的方式實現平等:如果兩個參與者是相同的對象,或者對象的值相等,或用戶標識是唯一的,如果它們具有相同的用戶標識,則兩個參與者是相等的? –

回答

1

你真的不想使用選擇。而是使用Distinct方法的自定義IEqualityComparer。這樣

public class CustomEqualityComparer : IEqualityComparer<Participant> 
{ 
    public bool Equals(Participant x, Participant y) 
    { 
     return x.UserId == y.UserId && x.Name == y.Name; 
    } 

    public int GetHashCode(Participant obj) 
    { 
     return new Tuple<int, string>(obj.UserId, obj.Name).GetHashCode(); 
    } 
} 

東西然後你的電話是這樣的:

participants = project.QuickView.Distinct(new CustomEqualityComparer()).ToList(); 
相關問題