在 C# 中获取排序列表中的第二个 int 记录的 IndexOf
Get IndexOf Second int record in a sorted List in C#
我在尝试获取第一个和第二个 Record(不是第二个 highest/lowest integer)索引时遇到问题排序列表。假设该列表由三个记录组成,顺序如下: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。但这可能适用于任何最小的数字并在列表中重复出现。
但是,当最小值不重复时,它也必须起作用。
您可能在问这样的问题:
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。因此每次您请求 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
根据您的代码,我猜您将某种 "instance equality" 与常规 "equality" 混淆了。
Int 是一种简单类型,IndexOf 不会搜索 你的特定实例 0 的出现。
请记住这段代码,即使我们将思想转移到实际对象中:
MyList.OrderBy(item => item).Take(2).ToArray()[1]
不一定return输入列表中原始相对顺序相同的对象。
编辑
这不能用于一般情况,从原始无序列表中获取有序值的索引。
如果要搜索任意数量的相等值的索引,那么将IndexOf 的第二个参数的偏移量设置得越来越大就可以了。
但是,让我们考虑没有重复项的情况。这种方法只有在实际订购输入列表时才有效;)
您可以对输入列表进行预处理以生成对 (value = list[i],idx = i),然后按值对这些对进行排序,然后遍历排序后的对并打印 idx-es
我在尝试获取第一个和第二个 Record(不是第二个 highest/lowest integer)索引时遇到问题排序列表。假设该列表由三个记录组成,顺序如下: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。但这可能适用于任何最小的数字并在列表中重复出现。 但是,当最小值不重复时,它也必须起作用。
您可能在问这样的问题:
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。因此每次您请求 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
根据您的代码,我猜您将某种 "instance equality" 与常规 "equality" 混淆了。 Int 是一种简单类型,IndexOf 不会搜索 你的特定实例 0 的出现。 请记住这段代码,即使我们将思想转移到实际对象中:
MyList.OrderBy(item => item).Take(2).ToArray()[1]
不一定return输入列表中原始相对顺序相同的对象。
编辑
这不能用于一般情况,从原始无序列表中获取有序值的索引。
如果要搜索任意数量的相等值的索引,那么将IndexOf 的第二个参数的偏移量设置得越来越大就可以了。 但是,让我们考虑没有重复项的情况。这种方法只有在实际订购输入列表时才有效;)
您可以对输入列表进行预处理以生成对 (value = list[i],idx = i),然后按值对这些对进行排序,然后遍历排序后的对并打印 idx-es