代码之家  ›  专栏  ›  技术社区  ›  James

是否可以使用LINQ执行基于集的属性分配?

  •  1
  • James  · 技术社区  · 14 年前

    我想测试LINQ到底能走多远。我试图实现的是用一个表达式而不是循环对对象列表进行属性分配。我想把listA中的所有项目更新为 IsMatched

    示例代码:

    public struct A { public int x; public bool IsMatched;}
    public struct B {public int x;}
    
    static void Main(string[] args)
    {
      List<A> listA = new List<A>(); 
      List<B> listb = new List<B>();
      listA.Add(new A() { x=1}); 
      listA.Add(new A() { x=2}); 
      listA.Add(new A() { x=3});
    
      listb.Add(new B() { x=2}); 
      listb.Add(new B() { x=3});
    
      listA = listA.SelectMany(fb => listb, (fb, j) => new {a=fb, b=j})
            .Where (anon => anon.b.x == anon.a.x).Select(anon => new A() {x=anon.a.x, IsMatched=true})
            .ToList(); // this does not do what I want.
    
    }
    

    我试过使用SelectMany,但这只返回匹配的项,或者返回我不想要的笛卡尔积。

    1 回复  |  直到 14 年前
        1
  •  5
  •   Jeff Mercado    14 年前

    林肯并不是为了引起副作用而设计的。在这种情况下,请修改集合中的项。只需创建查询以选择要修改的项,然后根据需要循环修改这些项。

    var query = from a in listA
                join b in listB on a.x equals b.x
                select a;
    foreach (var a in query)
        a.IsMatched = true;
    

    (from a in listA
     join b in listB on a.x equals b.x
     let modify = new Func<A,A>(m => { m.IsMatched = true; return m; })
     select modify(a)).ToArray();