[英]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.