C# 按顺序选择所有元素的索引
使用LINQ,我可以编写一条语句,返回项的索引的IEnumerable 非常简单的例子:C# 按顺序选择所有元素的索引,c#,linq,select,indexing,C#,Linq,Select,Indexing,使用LINQ,我可以编写一条语句,返回项的索引的IEnumerable 非常简单的例子: {1,2,4,5,3} 我会回来的 {0,1,2,3,4} 及 会回来吗 {2} 它不是精确的代码,但应该能让人理解它。如果您愿意稍微修改一下语法并使用扩展方法,下面的方法就行了。我对它不感兴趣,因为它为每个调用创建了一个新的序列 var sequence = new[] { 1, 2, 4, 5, 3 }; sequence.Indexer().Select(num => num.Item1
{1,2,4,5,3}
我会回来的
{0,1,2,3,4}
及
会回来吗
{2}
它不是精确的代码,但应该能让人理解它。如果您愿意稍微修改一下语法并使用扩展方法,下面的方法就行了。我对它不感兴趣,因为它为每个调用创建了一个新的序列
var sequence = new[] { 1, 2, 4, 5, 3 };
sequence.Indexer().Select(num => num.Item1); // returns {0,1,2,3,4}
sequence.Indexer().Where(num => num.Item2 == 4).Select(num => num.Item1); // returns {2}
private static IEnumerable<Tuple<int, T>> Indexer<T>(this IEnumerable<T> sequence)
{
return sequence.Select((x, y) => new Tuple<int, T>(y, x));
}
这应该可以做到。不过,我不知道它的效率有多高
List<int> list = new List<int>()
{
1,
2,
3,
4,
5
};
var indexes = list.Select(item => list.IndexOf(item));
var index = list.Where(item => item == 4).Select(item => list.IndexOf(item));
var a=新[]{1,2,4,5,3};
//**首先,生成一个具有{0,1,2,3,4}的简单序列
//**使用2参数lambda select
var sequence1=a.选择指数,指数=>index;
//**其次,获取一个包含所有索引的数组,其中值为4。
//我们需要值和索引,以便下一行工作。
var sequence2=a.Selectvalue,index=>new{value,index};
//获取值为4的所有索引
var indexArray=sequence2。其中x=>x.value==4
.Selectx=>x.index.ToArray;
整套索引只取决于项目的数量,而不取决于值,因此您可以这样做:
IEnumerable<int> indices = Enumerable.Range(0, 5);
但是,我怀疑问题真正要寻找的是找到与特定谓词匹配的值的所有索引的方法。例如:
IEnumerable<int> big = values.Select((v, i) => new {v, i})
.Where(vi => vi.v > 3)
.Select (vi => vi.i);
返回大于3的值的索引:[3,4]
如果谓词与任何值都不匹配,那么结果将是一个空的可枚举项。您可以这样做:
public static IEnumerable<int> WhereIndices<T>(this IEnumerable<T> source, Func<T, bool> predicate)
{
return source.Select(Tuple.Create<T, int>)
.Where(z => predicate(z.Item1)).Select(z => z.Item2);
}
如果集合是IEnumerable,那么它就没有效率。必须复制到数组或列表中。这有帮助吗?你真的问了这个问题?任何Linq文档都包含许多类似的示例。此外,您必须知道正在处理的数组的范围,或者有一个排序数组的副本,同时还有一个未排序数组来检查索引。@I4V,请发布一个链接。您似乎是唯一真正理解这个问题的人。顺便说一句,您可以选择list.IndexOf,简称为-1 list.Selectitem=>list.IndexOfitem;我想不出更糟糕的方法了。在^2上,根本没有效率,因为问题是线性的。@Ric抱歉,我意识到我的答案有点混乱,第一部分只是显示您可以选择索引以获得{0,1,2,3,4},正如问题所述,第二个序列和WriteLine一起求解选择索引,其中值为x,这也是问题所要求的。当然,如果值重复出现,则需要执行ToArray而不是FirstOrDefault来获取所有值。
IEnumerable<int> seq = new[] { 1, 2, 4, 5, 3 };
// The indexes of all elements.
var indexes = Enumerable.Range(0, seq.Count());
// The index of the left-most element with value 4.
// NOTE: Will return seq.Count() if the element doesn't exist.
var index = seq.TakeWhile(x => x != 4).Count();
// The indexes of all the elements with value 4.
// NOTE: Be careful to enumerate only once.
int current_index = 0;
var all_indexes =
from e in (
from x in seq
select new { x, Index = current_index++ }
)
where e.x == 4
select e.Index;
IEnumerable<int> indices = Enumerable.Range(0, 5);
IEnumerable<int> values = new[] { 1, 2, 3, 4, 5 };
int indexOf4 = (
values.Select((v, i) => new {v, i})
.FirstOrDefault(vi => vi.v == 4) ?? new {v = 0, i = -1}).i;
int indexOf4a = values.ToList().IndexOf(4);
IEnumerable<int> big = values.Select((v, i) => new {v, i})
.Where(vi => vi.v > 3)
.Select (vi => vi.i);
public static IEnumerable<int> WhereIndices<T>(this IEnumerable<T> source, Func<T, bool> predicate)
{
return source.Select(Tuple.Create<T, int>)
.Where(z => predicate(z.Item1)).Select(z => z.Item2);
}
.WhereIndices(num => num == 4)