Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以使用LINQ执行基于集合的属性指定?_Linq - Fatal编程技术网

是否可以使用LINQ执行基于集合的属性指定?

是否可以使用LINQ执行基于集合的属性指定?,linq,Linq,我想测试LINQ到底能走多远。我试图实现的是使用单个表达式而不是循环在对象列表上指定属性。我想获取listA中的所有项目并更新IsMatched属性,但只有在listB中有相应的项目(这是一种不同的类型)的情况下,才可以这样做吗 示例代码: public struct A { public int x; public bool IsMatched;} public struct B {public int x;} static void Main(string[] args) { List

我想测试LINQ到底能走多远。我试图实现的是使用单个表达式而不是循环在对象列表上指定属性。我想获取listA中的所有项目并更新
IsMatched
属性,但只有在listB中有相应的项目(这是一种不同的类型)的情况下,才可以这样做吗

示例代码:

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.

}
public结构A{public int x;public bool IsMatched;}
公共结构B{public int x;}
静态void Main(字符串[]参数)
{
List listA=新列表();
List listb=新列表();
Add(新的A(){x=1});
Add(新的A(){x=2});
Add(新的A(){x=3});
Add(新的B(){x=2});
Add(新的B(){x=3});
listA=listA.SelectMany(fb=>listb,(fb,j)=>new{a=fb,b=j})
.Where(anon=>anon.b.x==anon.a.x)。选择(anon=>newa(){x=anon.a.x,IsMatched=true})
.ToList();//这不是我想要的。
}

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

LINQ的设计不是为了产生副作用。在这种情况下,请修改集合中的项。只需创建查询以选择要修改的项,然后根据需要对这些项进行修改

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;
然而,你可以作弊,并制定一个lambda来引起副作用。然后将其用作聚合方法。但是你不应该在实践中这样做

(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();
(来自列表a中的
在a.x等于b.x的列表b中加入b
让modify=newfunc(m=>{m.IsMatched=true;返回m;})
选择modify(a)).ToArray();

LINQ的设计不是为了产生副作用。在这种情况下,请修改集合中的项。只需创建查询以选择要修改的项,然后根据需要对这些项进行修改

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;
然而,你可以作弊,并制定一个lambda来引起副作用。然后将其用作聚合方法。但是你不应该在实践中这样做

(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();
(来自列表a中的
在a.x等于b.x的列表b中加入b
让modify=newfunc(m=>{m.IsMatched=true;返回m;})
选择modify(a)).ToArray();

@Jeff M-谢谢-显然,任务可以在匿名方法中完成签出,请自己阅读。这至少让我半途而废。@Jeff M-对不起,下次我需要更仔细地阅读;)。为什么这样做被认为是一种不好的做法?@James:正如第一部分提到的,;)LINQ并不是真正设计用来产生副作用的,只是对数据集进行操作。@Jeff M-这并不能真正解释为什么这是一种不好的做法,因为它可以不费吹灰之力地完成。@James:没有什么可以阻止你,并不意味着你应该这样做。我不确定我是否能充分解释原因。也许解释为什么没有
ForEach()
扩展方法(这就是我们在这里所做的)的文章可以解释得足够多。@Jeff M-谢谢-显然可以在匿名方法签出内完成任务,请自己阅读。这至少让我半途而废。@Jeff M-对不起,下次我需要更仔细地阅读;)。为什么这样做被认为是一种不好的做法?@James:正如第一部分提到的,;)LINQ并不是真正设计用来产生副作用的,只是对数据集进行操作。@Jeff M-这并不能真正解释为什么这是一种不好的做法,因为它可以不费吹灰之力地完成。@James:没有什么可以阻止你,并不意味着你应该这样做。我不确定我是否能充分解释原因。也许解释为什么没有
ForEach()
扩展方法(这正是我们在这里所做的)的文章可以解释得足够多