繁体   English   中英

在 C# 中的排序列表中获取 IndexOf 第二个 int 记录

[英]Get IndexOf Second int record in a sorted List in C#

我在尝试从排序列表中获取第一条记录和第二条记录(不是第二高/最低整数)索引时遇到问题。 假设列表由三个记录组成,顺序如下: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。但这可能适用于任何最小且在列表中重复的数字。 但是,当最小值不重复时,它也必须起作用。

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

您可能会问这样的问题:

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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM