C# 获取C中排序列表中第二条int记录的索引

C# 获取C中排序列表中第二条int记录的索引,c#,list,indexof,C#,List,Indexof,我在尝试从排序列表中获取第一个和第二个记录而不是第二个最高/最低整数索引时遇到问题。假设这个列表由三条记录组成,它们的顺序如下:0,0,1 我试着这样做: int FirstNumberIndex = MyList.IndexOf(MyList.OrderBy(item => item).Take(1).ToArray()[0]); //returns first record index, true int SecondNumberIndex = MyList.IndexOf(MyLis

我在尝试从排序列表中获取第一个和第二个记录而不是第二个最高/最低整数索引时遇到问题。假设这个列表由三条记录组成,它们的顺序如下:0,0,1

我试着这样做:

int FirstNumberIndex = MyList.IndexOf(MyList.OrderBy(item => item).Take(1).ToArray()[0]); //returns first record index, true
int SecondNumberIndex = MyList.IndexOf(MyList.OrderBy(item => item).Take(2).ToArray()[1]); //doesn't seem to work
正如我所解释的,我试图得到前两个0的索引,它们不一定在排序之前按升序排列,也不一定是0和1。 所以如果有一个列表{0,2,4,0},我需要得到索引0和3。但这可能适用于任何最小且在列表中重复的数字。
但是,当最小值不重复时,它也必须起作用。

您可能会问这样的问题:

var list = new List<int>{0,0,1}; 
var result = list.Select((val,i)=> new {value = val, idx = i}).Where(x=>x.value == 0);
foreach(var r in result) //anonymous type enumeration
    Console.WriteLine(r.idx);

您可以尝试用户FindIndex

var MyList = new List<int>() {3, 5, 1, 2, 4};
int firsIndex = MyList.FindIndex(a => a == MyList.OrderBy(item => item).Take(1).ToArray()[0]);
int secondIndex = MyList.FindIndex(a => a == MyList.OrderBy(item => item).Take(2).ToArray()[1]);

您可以计算第一次出现的偏移量,然后在跳过偏移量后在列表上使用IndexOf

int offset = ints.IndexOf(0) + 1;
int secondIndex = ints.Skip(offset).ToList().IndexOf(0) + offset;

SecondNumberIndex设置为0,因为

MyList.OrderBy(item => item).Take(2).ToArray()[1] == 0
然后你得到

 MyList.IndexOf(0)
它将查找0的第一次出现。0与其他0相等。因此,每次您请求IndexOf0时,都会找到列表中的第一个0

通过使用这种方法,您可以得到您想要的:

int FirstNumberIndex = MyList.IndexOf(0); //returns first record index, true
int SecondNumberIndex = MyList.IndexOf(0, FirstNumberIndex  + 1 ); //will start search next to last ocurrence
从您的代码中,我猜您混淆了某种实例等式和常规等式。 Int是一个简单类型,IndexOf不会搜索特定0实例的出现。 请记住,即使我们将思想转移到实际对象,这段代码:

MyList.OrderBy(item => item).Take(2).ToArray()[1]
不一定会从输入列表中以原始相对顺序返回相等的对象

编辑

这不能用于一般情况,即从原始无序列表中获取有序值的索引

如果要搜索任意数量的相等值的索引,则可以为IndexOf的第二个参数设置越来越大的偏移量。 但是,让我们考虑一个没有重复的情况。只有当输入列表实际排序时,这种方法才会起作用


您可以预处理输入列表,使pairs value=list[i],idx=i,然后按值对这些对进行排序,然后对排序后的对进行迭代并打印idx es

对具有相同值的两个最小记录有效吗?int secondIndex=MyList.FindLastIndexa=>a==MyList.OrderByitem=>item.Take2.ToArray[1];对于第二个记录索引,它似乎仍然返回0作为索引,这相当复杂。IndexOf使用startIndex参数重载了版本。这正是我的问题。一个问题。您在MyList.IndexOf0中使用了0;那代表记录值吗?如果是这样,我可以通过获取第一条记录将其更改为MyList.OrderBy。是吗?一般来说-不是。当你想在原始的输入列表中获得排序列表的索引列表时,这种方法并不适合开始。这更像是解释它没有达到你期望的原因。给我一点时间编辑一下。@positive从长远来看,你的案子毫无意义。你丢失了原始索引的信息。太棒了。它就像一个符咒。我完全按照你们所说的做了:我将list转换为list,其中第一个元素代表值[I],第二个代表值,然后我按第一个值排序,跳过一个,得到FirstOrDefault并选择ElementAt1。这样,我提取了第二个值的索引,即使该值在顺序上等于第一个值。谢谢,这就是我们要走的路。