【问题标题】:Set specific value of one list from another从另一个列表中设置一个列表的特定值
【发布时间】:2016-07-14 19:27:05
【问题描述】:

我有以下强数据类型的两个列表(listA 和 listB):

   public class TagPresenter
    {    
        public string TagName { get; set; }
        bool IsEnable { get; set; }     
        public string TagId { get; set; }
    }

当在 ListA 中找到 listB 的项目时,我需要将 ListA 的 IsEnable 设置为 true。这种比较应该发生在 TagId 上。 A拥有B拥有的所有物品。所以简而言之,如果 B 有 3 个项目而 A 有 10 个项目,那么在这种情况下,我需要 ListA 中所有这 3 个项目的 IsEnable 属性为 true。我需要在 LINQ 中执行此操作。请帮助。

【问题讨论】:

  • “我需要在 LINQ 中执行此操作。”为什么? Linq 用于查询,而不是更新
  • @DStanley,也可以用来更新...
  • @Great.And.Powerful.Oz 真的吗? update ListA set ListA.IsEnable = true where ... 之类的东西 - 哎呀,这是 SQL :)
  • @Great.And.Powerful.Oz 你也可以用活动扳手来打钉子——但这并不意味着它是正确的工具。
  • @Great.And.Powerful.Oz 这不是一个“宗教”立场——使用 Linq 更新数据有一些缺点。请参阅 hereherehere。是的,你可以做到,但你必须知道风险。

标签: c# asp.net .net asp.net-mvc linq


【解决方案1】:

在 Linq 中更新非常麻烦 - 使用 Linq 查找匹配项但使用 foreach 更新它们更符合习惯

var query =
    from a in listA
    join b in listB on a.TagId equals b.TagId
    select a
    ;

foreach(var a in query)
{
    a.IsEnable = true;
}

【讨论】:

  • 我忘了说我需要 ListA 中的输出来反映。上面的代码会这样做吗?
  • “反射”是什么意思?如果您的意思是在枚举 ListA 时反映更改,那么可以,因为查询将 references 返回到列表中的对象。
【解决方案2】:

这是我的第一篇文章,如果我犯了错误,我很抱歉,也对不起我的英语。

下面的代码是使用 Linq 更新已经加载到内存中的列表的属性:

添加类 =>

   public static class LINQToObjectExtensions
    {
        public static void UpdateAll<T>(this IEnumerable<T> source, Action<T> action)
        {
            foreach (var item in source)
                action(item);
        }
    }

之后:

ListA.UpdateAll(p => p.Property = Value);

ListA.Where(p => p.Id = 1).UpdateAll(p => p.Property = Value);

【讨论】:

    【解决方案3】:

    试试这个

    var query =
        from a in listA
        join b in listB on a.TagId equals b.TagId
        select new TagPresenter
        {    
           TagName = a.TagName,
           IsEnable = true,
           TagId = a.TagId
        };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-16
      • 1970-01-01
      • 2022-11-17
      • 2022-01-01
      • 1970-01-01
      • 2020-03-20
      • 1970-01-01
      相关资源
      最近更新 更多