【问题标题】:Update List<T> using foreach loop and Condition using LINQ/LAMBDA [duplicate]使用 foreach 循环和使用 LINQ/LAMBDA 的条件更新 List<T> [重复]
【发布时间】:2013-02-06 13:13:10
【问题描述】:

我想做这样的事情

foreach (var item in SeasonList)
{
    if (item.Text == "ALL")
    {
        item.IsSelected = true;
    }
}

【问题讨论】:

  • 什么阻止了你?
  • 我想使用 LINQ/LAMBDA 进行循环和调节
  • @Romoku:但是您可以在枚举时修改列表中的对象!这是一个重要的区别。
  • 为什么会有这种不必要的使用 linq 的冲动?这就像我们这个时代的新正则表达式 - 有问题吗?用 linq 解决!
  • @Romoku:我不关注。 OP 不想更改列表。他只是想更改列表中项目的属性。

标签: c#


【解决方案1】:
foreach(var item in SeasonList.Where(x => x.Text == "ALL"))
{
    item.Selected = false;
}

【讨论】:

  • 简单易懂,很好地利用了 LINQ 和 foreach(是的,可以用 LINQ 编写循环!),+1。
  • 同意。公平竞争吧,这是一个很好的解决方案。
  • @Aron:感谢您的解决方案
【解决方案2】:

这也可能有效,但在我看来,你所做的已经很好了。

SeasonList.ForEach(s => s.IsSelected = s.TEXT != "ALL");

或者,完全匹配初始要求:

SeasonList.Where(s => s.TEXT == "ALL").ToList().ForEach(s => s.IsSelected = false);

【讨论】:

  • 仅供参考,这并不完全正确。当TEXT == "ALL" 时,这IsSelected 设置为true;原始代码将条目设置为false,并且没有修改它们(尽管我敢打赌这是正确的意图)
  • 我认为仍然不合适,如果 item.Text 不是“ALL”,OP 不想更改 IsSelected
  • 你说得对,我错过了这个实现细节。然后再进行一次编辑。
  • 它的工作...
  • @ChrisSinclair 当TEXT == "ALL" 时如何将IsSelected 设置为true?更新:我现在看到 OP 改变了问题,最初你的陈述是有道理的。
【解决方案3】:
class Program
{
    static void Main(string[] args)
    {
        List<ItemObject> items = new List<ItemObject>()
        {
            new ItemObject() { Text = "Text 1", IsSelected = true },
            new ItemObject() { Text = "Text 2", IsSelected = true },
            new ItemObject() { Text = "ALL", IsSelected = true }
        };

        items.ForEach(x => { if (x.Text == "ALL") x.IsSelected = false; });
    }
}

class ItemObject
{
    public string Text { get; set; }
    public bool IsSelected { get; set; }
}

【讨论】:

    【解决方案4】:
    SeasonList.ForEach(q => q.IsSelected = q.Text == "ALL" ? false : q.IsSelected)
    

    【讨论】:

      【解决方案5】:

      使用索引更新

              var index = SeasonList.FindIndex(x => x.Text == "ALL");
              if (index > 0) SeasonList[index].IsSelected = false;
      

      另一种选择

            foreach (var item in SeasonList.FindAll(x => x.Text == "ALL"))
              {
                  item.IsSelected = false;
              }
      

      注意:

      查看 Jon Skeet 的回答 LINQ is for querying - not for updating.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-26
        • 2016-08-27
        • 1970-01-01
        • 2015-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多