C# LINQ对IEnumerable上重叠元素的运算 让我们考虑一个iQueDaby,该算法采用重叠索引,例如{ 0, 1 }、{ 1, 2 }、{ 2, 3 }等。根据这些索引的值创建一个新集合,例如{集合[0 ],集合[1 ]=>结果[0 ] },{集合[1 ],集合[2 ]=>结果[1 ] }等等。下面是一个直接实现的示例: IEnumerable<string> collection = new string[100]; var array = collection.ToArray(); var results = array.Skip(1).Select((e, i) => e - array[i]);

C# LINQ对IEnumerable上重叠元素的运算 让我们考虑一个iQueDaby,该算法采用重叠索引,例如{ 0, 1 }、{ 1, 2 }、{ 2, 3 }等。根据这些索引的值创建一个新集合,例如{集合[0 ],集合[1 ]=>结果[0 ] },{集合[1 ],集合[2 ]=>结果[1 ] }等等。下面是一个直接实现的示例: IEnumerable<string> collection = new string[100]; var array = collection.ToArray(); var results = array.Skip(1).Select((e, i) => e - array[i]);,c#,algorithm,linq,C#,Algorithm,Linq,如何更好地实现目标 var result = Enumerable.Range(1, arrayCollection.Length - 1) .Select(i => new[] {arrayCollection[i - 1], arrayCollection[i]}); 如果arrayCollection是IEnumerable 如果arrayCollection是IEnumerable 还有一个: var ints = Enumerable.Range

如何更好地实现目标

 var result = Enumerable.Range(1, arrayCollection.Length - 1)
               .Select(i => new[] {arrayCollection[i - 1], arrayCollection[i]});
如果arrayCollection是IEnumerable

如果arrayCollection是IEnumerable


还有一个:

var ints = Enumerable.Range(0, 10);
var paired = ints.Zip(ints.Skip(1), Tuple.Create);
这样你会得到{0,1},{1,2}对


我想这就是您所要求的,因为您的代码示例与您所描述的稍有不同…:

还有一个:

var ints = Enumerable.Range(0, 10);
var paired = ints.Zip(ints.Skip(1), Tuple.Create);
var array = new string[] { "one", "two", "three" };
var result = Enumerable.Range(1, array.Length - 1)
                        .Select(i => new[] { array[i - 1], array[i] });
这样你会得到{0,1},{1,2}对

我想这就是您所要求的,因为您的代码示例与您所描述的稍有不同…:

var array = new string[] { "one", "two", "three" };
var result = Enumerable.Range(1, array.Length - 1)
                        .Select(i => new[] { array[i - 1], array[i] });
这里是@TrustMe解决方案,使用数组而不是元组只是为了向您展示示例,您不应该接受我的答案:

IEnumerable<string> collection = new string[] { "one", "two", "three" };
var result = collection.Zip(collection.Skip(1), (x,y) => new [] { x, y });
这里是@TrustMe解决方案,使用数组而不是元组只是为了向您展示示例,您不应该接受我的答案:

IEnumerable<string> collection = new string[] { "one", "two", "three" };
var result = collection.Zip(collection.Skip(1), (x,y) => new [] { x, y });


您的代码示例似乎与问题无关。您能澄清一下吗?您的代码示例似乎与问题无关。你能澄清一下吗?我讨厌元组,但Zip是clever@lazyberezovsky我必须承认,在C和Scala中,元组也有点笨重,但它总是一对;一对糟糕的非描述性名称:我需要的是值,而不是索引。但是重叠索引的值。我需要t[1]-t[0],然后t[2]-t[1],依此类推。我需要对{0,1},{1,2},{2,3},@lazyberezovsky:Cuong-Le的解决方案满足要求,并且比我的示例中的更好。我讨厌元组,但Zip是clever@lazyberezovsky我必须承认,在C和Scala中,元组也有点笨重,但它总是一对;一对糟糕的非描述性名称:我需要的是值,而不是索引。但是重叠索引的值。我需要t[1]-t[0],然后t[2]-t[1],依此类推。我需要对{0,1},{1,2},{2,3},@lazyberezovsky:Cuong-Le的解满足要求并且比我的例子中的解好。你有没有和想法如何省略arrayCollection并使用collection?@yBee:恐怕我不完全理解你的意思,请你澄清一下好吗?我想直接从IEnumerable而不是数组中获取重叠对。在我的示例中,我创建了array arrayCollection以实现这一目标,但我不会这样做。我需要集合中的成对值,这些值来自重叠索引。如果不假设集合是一个数组,那么解决方案将与预先使用.ToArray的情况相比较?有没有什么方法可以在迭代过程中存储当前值,以便以后在查询中使用?@yBee:IEnumerable是表示,int[]也是IEnumerable,如果只是查询数据,不做任何更改,IEnumerable对你来说已经足够了,你有没有想过如何省略arrayCollection而使用collection?@yBee:恐怕我不完全理解你的意思,请你进一步澄清一下,我想直接从IEnumerable而不是从数组中取重叠对。在我的示例中,我创建了array arrayCollection以实现这一目标,但我不会这样做。我需要集合中的成对值,这些值来自重叠索引。如果不假设集合是一个数组,那么解决方案将与预先使用.ToArray的情况相比较?有没有什么方法可以在迭代过程中存储当前值,以便以后在查询中使用?@yBee:好吧,IEnumerable是表示,int[]也是IEnumerable,如果你只是查询数据,不做任何更改,IEnumerable就够了,看来自定义迭代器是最好的方法。一旦声明,就可以很容易地用于查询重叠项。Zip只允许创建对,所以我不能使用像{0,1,2},{1,2,3}这样更复杂的场景。范围对于ICollections是足够的。看来自定义迭代器是最好的方法。一旦声明,就可以很容易地用于查询重叠项。Zip只允许创建对,所以我不能使用像{0,1,2},{1,2,3}这样更复杂的场景。范围对于ICollections是足够的。