假设我有这两个数组:

const int length = 5;
var ints = new int[length] { 1, 2, 3, 4, 5 };
var strings = new string[length] { "s1", "s2", "s3", "s4", "s5" };

我想循环这些而不是这个

for (var index = 0; index < length; index++)
{
    var i = ints[index];
    var s = strings[index];
    DoSomething(i, s);
}

我想知道我是否可以使用LINQ以某种方式实现这样的目标

var items = ... i in ints
            ... s in strings
            select new { I = i, S = s };

foreach (var item in items)
{
    DoSomething(item.I, item.S);
}

只是做了嵌套from这样不起作用

var items = from i in ints
            from s in strings
            select new { I = i, S = s };

因为这将重复内from每个外迭代。

===============>>#1 票数:5

你想要linq Zip。 例如,请查看此站点http://jesseliberty.com/2011/06/13/the-linq-zip-operator/

我还是要添加一个例子来指出一些问题。 Zip总是会达到最短的长度。 即使在6的整数,它仍然会返回5。我知道在你的例子中你有相同的但只是传递有关linq的Zip的信息。

var ints = new int[] { 1, 2, 3, 4, 5, 6 };
var strings = new string[] { "s1", "s2", "s3", "s4", "s5" };
var zipper = ints.Zip(strings, (i, s) => new {i, s});

===============>>#2 票数:5

正如@CharlesNRice所建议的,您可以像这样使用LINQ Zip:

var items = ints.Zip(strings, (i, s) => new {I = i, S = s});

===============>>#3 票数:3

我看到人们创建了一个新对象,但没有人展示如何调用DoSomething。

我相信这就是你想要的:

ints.Zip(strings, (i,s) => DoSomething(i,s));

正如Grant所指出的,如果DoSomething返回void,则需要以下内容:

ints.Zip(strings, (i,s) => { DoSomething(i,s); return 0;} );

同样重要的是要记住Linq是懒惰的! 在实际导致此代码运行之前,不会发生任何事情。 例如:

var a = ints.Zip(strings, (i,s) => { DoSomething(i,s); return 0;} );

不会导致DoSomething被调用。 然而

a.ToList();

要么

a.Count();

将导致为所有值调用DoSomething。

您也可以将ToList()或Count()添加到第一个语句的末尾,这是您问题的最佳答案:

ints.Zip(strings, (i,s) => { DoSomething(i,s); return 0;} ).Count();

===============>>#4 票数:2 已采纳

这也可以使用Select方法完成:

ints.Select((x,idx) => new { I = x, S = strings[idx] });

  ask by Johann Gerell translate from so

未解决问题?本站智能推荐:

2回复

将LINQ与OData AddQueryOption相结合

OData的限制( 此处列出 )阻止我从我的OData源添加动态where子句到数据集。 我发现之前的帖子回答了我对动态过滤器的查询,即将AddQueryOption方法与自定义构建的查询字符串一起使用。 但是,似乎没有办法将此查询字符串与标准LINQ查询组合在一起。 使用上述方法生成
5回复

LINQ在不同类型的集合中选择项目

一个人如何实现LINQ从一个类型为A的对象集合中提取Guid,以便它们可以从另一个类型为B的对象集合中排除这些Guid。对象A和对象B都有一个Guid字段,称为“ ID”。 我有以下几点: ObservableCollection<Component> compone
2回复

为什么不能将LINQ to XML与LINQ to SQL相结合?

我有这段代码: 运行此代码时,出现以下异常: LINQ to Entities无法识别方法System.Xml.Linq.XAttribute Attribute(System.Xml.Linq.XName)-方法,并且该方法无法转换为商店表达式 但是,当我将此行提取到
4回复

LINQ:通过使它们可转换/可比较,对不同类型的集合使用.Except()?

给定两个不同类型的列表,是否可以使这些类型在彼此之间可转换或可比较(例如,使用TypeConverter或类似设备),以便LINQ查询可以对其进行比较? 我已经在SO上看到了其他类似的问题,但是没有任何东西指向使类型之间可以转换以解决问题。 集合类型: 所需用法: 似乎合
2回复

将LINQ Except()与两个不同类型的集合一起使用

我不能在此使用示例,因为它特定于问询者所使用的结构。 目前,我要去: 我宁愿一行中有一些内容,例如: 有任何想法吗?
3回复

使用linq从不同类型的目标集合中的源集合中找到某个值

我想知道在由Name属性标识的targetList中包含分号之后,是否还有一个sourceList值。 如果是这样,则必须返回布尔值。 它不起作用,但是我尝试了一些... 我想我的linq是不正确的。 “ FoundSomething”包含在targetList中,因此它应该
3回复

Linq不同类型的条件

我有一个从ProfileBase派生的列表。 此列表可以包含Profile,DynamicViewProfile的实例,因为两者均派生自ProfileBase 但是,如果项目类型为DynamicViewProfile,则我必须使用NodeName,如果Profile,则我应该使用DocN
1回复

Linq排序列表及其相同类的嵌套集合

我有以下课程 这是一个树形列表,将节点保存在该节点内,我想获取KaartNum排序的列表,然后按Name排序,我尝试了以下排序以获得所需的结果。 它仅适用于根类级别,不适用于该属性的嵌套子代,我只需要对Name属性进行排序。
2回复

通用集合中的不同类型

我有一个对象清单 我正在尝试访问动物内部所有不同Type的animals (例如Dog , Cat , Walrus ),并使用这种想法将其放入另一个通用集合中: 要么 但是我很难将其中任何一个都编译。
2回复

LINQ以匿名类型获取集合

我有以下LINQ语句: Tasks是对象的集合,而where子句 tasks.Property == "something"匹配集合中的多个项目,但是当我在select中使用匿名类型时,我只会取回匹配结果中的一个(第一个)而不是任务的集合。 如何