比较arraylist c#

比较arraylist c#,c#,arraylist,sortedlist,C#,Arraylist,Sortedlist,在c#中,如果我有一个数组列表,比如(ID,ITEMQUANTITY),并且我想通过ID来比较它们,我会怎么做? 我的意思是,我需要对它进行自定义,以便我可以仅通过第一个值进行比较,因此如果我想插入另一项,我可以检查id是否已在列表中。。。。 我知道如何通过遍历arraylist中的所有项来实现这一点,但我记得不久前在Java中通过重写某些接口、方法或其他内容来实现这一点 目前我使用的是SortedList,我可以通过(KEY,VALUE)键进行比较。 但是,问题是,我不想对项目进行排序。。。

在c#中,如果我有一个数组列表,比如(ID,ITEMQUANTITY),并且我想通过ID来比较它们,我会怎么做? 我的意思是,我需要对它进行自定义,以便我可以仅通过第一个值进行比较,因此如果我想插入另一项,我可以检查id是否已在列表中。。。。 我知道如何通过遍历arraylist中的所有项来实现这一点,但我记得不久前在Java中通过重写某些接口、方法或其他内容来实现这一点

目前我使用的是SortedList,我可以通过(KEY,VALUE)键进行比较。 但是,问题是,我不想对项目进行排序。。。 我希望最后一个被放在最后一个位置。 如果我可以将SortedList设置为不排序项目,也许我可以绕过转换为arraylist

Tnx


安德烈

希望我能理解你想正确地做什么。我总是使用一个通用的
列表
,而不是
数组列表

创建用于存储数据的类:

class Item {
  public Int32 Id { get; set; }
  public Int32 Quantity { get; set; }
}
您可以向如下列表中添加新项目:

var list = new List<Item>();
list.Add(new Item { Id = 1, Quantity = 10 });
list.Add(new Item { Id = 2, Quantity = 20 });
您可以获取列表的最后一项:

var itemWithId2 = list.FirstOrDefault(i => i.Id == 2);
if (itemWithId2 == null)
  list.Add(new Item { Id = 2, Quantity = 20 });
var lastItem = list.Last();

几种方法各有利弊:

list.Any(item=>item.ID==newItem.ID)
如果有匹配的ID,则返回true,尽管这与循环相同(由于lambda的存在,确实稍微贵一点),但代码更简洁

在比较器对ID属性进行比较的地方维护HashSet意味着不会添加具有现有ID的新值

按ID顺序维护列表将允许您通过使用
BinarySearch()
,快速查找时间复杂度为O(log n)的现有对象,或者查找应插入此新项以维护顺序的位置


如果ID确实标识了对象(也就是说,当ID相等时,对象应被视为相等),则实现
IEquatable
以基于ID进行比较,重写
object.Equals()
以调用特定于类型的相等方法,重写
GetHashCode()
以返回ID的值(如果它是
int
,或者更小的整数类型,或者如果它是
uint
,则转换为
int
)或者ID的hashcode(如果它是另一种类型),这将意味着这将成为标识的默认概念,这意味着HashSet不需要特殊的比较器,而
Contains
将为您完成这项工作(请注意,
包含的
本质上也是一个循环)。

这样做对象:

public class MyObject
{
    public Int32 ID { get; set; }

    public Int32 Quantity { get; set; }

    public override bool Equals(Object obj)
    {
        if (obj == null)
            return false;

        if (obj.GetType() == GetType())
        {
            MyObject tmpObject = obj as MyObject;

            return ID.Equals(tmpObject.ID);
        }

        return false;
    }

    public override int GetHashCode()
    {
        return ID.GetHashCode();
    }
}
现在您可以将
ArrayList.Contains()
与许多其他相等方法一起使用


顺便说一句,正如所有其他人提到的,我也会使用
List

因为你说的是可能使用不同的集合类型:除非你的目标是.NET 1.1或者你被一个接口所强迫,否则今天没有理由仍然使用ArrayList。使用通用的
List
(或者改为
System.collections.generic
中的其他通用集合之一。