在C#中的排序列表中获取IndexOf Second int记录

时间:2018-09-21 14:51:22

标签: 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(MyList.OrderBy(item => item).Take(2).ToArray()[1]); //doesn't seem to work

正如我所解释的,我正在尝试获取前两个零(在排序之前不一定按升序排列)的索引,而不是零和1的索引。  因此,如果有一个列表{0,2,4,0},我需要获取索引0和3。但这可能适用于任何最小且在列表中重复的数字。 但是,当最小值不重复时,它也必须起作用。

4 个答案:

答案 0 :(得分:1)

SecondNumberIndex设置为0,因为

MyList.OrderBy(item => item).Take(2).ToArray()[1] == 0

然后您获得

 MyList.IndexOf(0)

发现第一个出现的0。0等于其他所有0。因此,每次您请求IndexOf(0)时,列表中的第一个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的第二个参数设置越来越大的偏移量。 但是,让我们考虑一个没有重复的情况。仅当输入列表实际排序时,这种方法才有效;)

您可以预处理输入列表以使其具有对(value = list [i],idx = i),然后按值对这些对进行排序,然后遍历已排序的对并打印idx-es

答案 1 :(得分:0)

您可能正在询问类似这样的内容:

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);

答案 2 :(得分:0)

您可以尝试使用用户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]);

答案 3 :(得分:0)

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

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