簡體   English   中英

在列表中設置對象屬性的值 <T> 使用LINQ

[英]Setting value of object property in List<T> using LINQ

我有一個List<Email>()並且我的Email對象看起來像這樣:

public class Email
{
   public string EmailAddress { get; set; }
   public bool IsPrimary { get; set; }
}

當我添加一個設置為主要的新電子郵件地址時,我想將所有其他電子郵件設置為非主要的。 我目前使用foreach處理此問題。 我可以使用LINQ處理嗎?

我當前的代碼是:

foreach (var item in emails)
{
   if(item.EmailAddress.ToLower() != newEmailAddress.ToLower() && item.IsPrimary)
      item.IsPrimary = false;
}

Linq查詢集合,但不會修改它們。 linq在此等式中唯一起作用的地方實際上是使其成為枚舉的一部分-過濾要迭代的集合,而不是在其中進行if語句。

foreach (var item in emails.Where(e => e.IsPrimary && !e.EmailAddress.Equals(newEmailAddress, StringComparison.InvariantCultureIgnoreCase)))
{
      item.IsPrimary = false;
}

編輯:我最初沒有包含它,因為它不是LINQ,這就是問題所在,但是正如您的問題List<T>的注釋中提到的那樣,它確實包含一個ForEach方法。

它看起來像這樣:

emails.ForEach(item =>
{
    item.IsPrimary = item.IsPrimary && item.EmailAddress.Equals(newEmailAddress, StringComparison.InvariantCultureIgnoreCase);
});

LINQ用於查詢而不是修改。 話雖這么說,這里有一個List.ForEach運算符,但是大多數時候可讀性沒有增加。

話雖如此,我個人更希望不會產生副作用,導致代碼修改集合,但是我不反對修改集合中的對象。

IEnumerable上添加擴展方法以封裝foreach循環:

public static void ForEach<T>(this IEnumerable<T> source, Action<T> action) {
    foreach (var s in source)
        action(s);
}

然后,您可以重新編寫代碼,如下所示:

emails.Where(item => item.IsPrimary && !item.EmailAddress.Equals(newEmailAddress, StringComparison.InvariantCultureIgnoreCase))
      .ForEach(item => item.IsPrimary = false);

(感謝@McAden,我始終忘記了更好的string比較。)

但是,由於您還是在創建競爭條件,因此,如果可行,我建議您反轉操作順序:

// before adding newEmailAddress
emails[emails.FindIndex(item => item.IsPrimary)].IsPrimary = false; // add error handling if it is possible no `IsPrimary` exists.
// now assign the newEmailAddress and set that item.IsPrimary to true

您可以輕松地做到這一點,但是您不應像沒有人期望LINQ代碼那樣修改集合中的項目。

emails
    .Where(item =>
       (item.EmailAddress.ToLower() != newEmailAddress.ToLower() && item.IsPrimary)
   .Select(item => { item.IsPrimary = false; return true;})
   .All();

請注意,由於LINQ查詢實際上是在枚舉result時執行的,因此您需要一些實際枚舉result的東西。 .All()調用。

編寫此代碼后會發生什么-某個人(或您一個星期內)會刪除該愚蠢且毫無意義的.All()調用最后,一切都會好起來的,但是修改不再發生,人們將花一天的時間對其進行排序然后使用一些單詞來描述代碼的作者。 不要去那

暫無
暫無

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

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