我有一个带有两个属性(IDa和IDb)作为标识符的自定义对象列表。
每次我删除一个对象时,我需要知道它的索引。如何在不循环整个列表的情况下获取对象的索引?
List<CustomObject> list = new List<CustomObject>();
list.RemoveAll((MiniMapRecord p) => p.IDa == IDa.SystemID & p.IDb == pInputRecordMap.IDb);
我有一个带有两个属性(IDa和IDb)作为标识符的自定义对象列表。
每次我删除一个对象时,我需要知道它的索引。如何在不循环整个列表的情况下获取对象的索引?
List<CustomObject> list = new List<CustomObject>();
list.RemoveAll((MiniMapRecord p) => p.IDa == IDa.SystemID & p.IDb == pInputRecordMap.IDb);
你需要的方法是 FindIndex(Predicate)
int index = list.FindIndex(MiniMapRecord p => p.IDa == IDa.SystemID & p.IDb == pInputRecordMap.IDb);
IndexOf()
是一个简单的解决方案,但它会耗费O(N)(线性时间)。IndexOf()
使用默认的 EqualityComparer
,因此如果您为项目重载了相等性,您可以控制它。否则,您可以使用 First()
或 Single()
(来自 LINQ),并传递一个谓词来测试/比较对象。var match = items.Single(item => item.Id == myId);
- Josh Gvar x = 4; var y = 4; x == y // is true
) - Josh Gvar x = new IntWrapper(4); var y = new IntWrapper(4); x != y // true
- Josh G您可以使用 IndexOf()
方法来获取您的 List<>
中给定元素的索引。
然而,需要注意的是,由于链表没有随机访问,因此除了从开头开始逐个检查一个元素之外,确实没有其他方法来查找特定元素(以及其索引)。
.IndexOf()
方法查找索引,然后使用 .RemoveAt()
方法将其删除。