簡體   English   中英

使用linq從列表中的2個可能字段中選擇distinct int

[英]Select distinct int from 2 possible fields in list using linq

我找了一個解決方案,但我無法理解它。 令我感到震驚的是linq應該能夠整齊地處理這個問題,但我並不是最好的制定linq查詢。 基本上我有一堂課;

public class Message
{
    public int CreatedByPersonID { get; set; }
    public int? PostedToPersonID { get; set; }
}

我正在尋找的是linq等效的;

List<int> personIDs = new List<int>();
foreach (Message message in messages)
{
    if (!personIDs.Contains(message.CreatedByPersonID))
    {
        personIDs.Add(message.CreatedByPersonID);
    }
    if (message.PostedToPersonID != null && !personIDs.Contains(message.PostedToPersonID.Value))
    {
        personIDs.Add(message.PostedToPersonID.Value);
    }
}

有linq版本嗎? 或者我期待太多的技術......? 我知道我正在尋找一些版本的Select()但我不知道如何用多個字段來表達一個distinct

List<int> personIDs = 
     messages.SelectMany(m => m.PostedToPersonID.HasValue ?
                  new int[] { m.PostedToPersonID.Value, m.CreatedByPersonID } :
                  new int[] { m.CreatedByPersonID })
             .Distinct()
             .ToList();

另一種選擇是枚舉兩次:

List<int> personIDs =
    messages.Where(m => m.PostedToPersonID.HasValue)
            .Select(m => m.PostedToPersonID.Value)
            .Concat(messages.Select(m => m.CreatedByPersonID))
            .Distinct()
            .ToList();

但是,如果沒有Linq,你可能會有更多可讀和更快的代碼

public IEnumerable<int> GetAllPersonIdsFrom(IEnumerable<Message> messages)
{
     foreach(var message in messages)
     {
         yield return message.CreatedByPersonID;

         if (message.PostedToPersonID.HasValue)
             yield return message.PostedToPersonID.Value;
     }
}

還有一個解決方案 - 單個枚舉具有不同的值

public static List<int> GetDistinctPersonIdsFrom(IEnumerable<Message> messages)
{
    HashSet<int> ids = new HashSet<int>();

    foreach (var message in messages)
    {
        ids.Add(message.CreatedByPersonID);
        if (message.PostedToPersonID.HasValue)
            ids.Add(message.PostedToPersonID.Value);
    }

    return ids.ToList();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM