比较arraylist c#

时间:2010-09-30 10:15:08

标签: c# arraylist sortedlist

在c#中如果我有一个像(ID,ITEMQUANTITY)填充的arraylist,我想通过ID比较它们,我该怎么做? 我的意思是,我需要自定义它,以便我可以仅通过第一个值进行比较,所以如果我想插入另一个项目,我可以检查id是否已经在列表中.... 我知道如何通过循环遍历arraylist中的所有项目来实现它,但我记得刚才用Java重写了一些接口或方法或其他东西......

目前我正在使用SortedList,我可以通过KEY(VAL,VALUE)进行比较。 但是,问题是,我不想要对物品进行分类...... 我希望它是最后一个放在最后一个位置。 也许我可以绕过转换为arraylist如果我可以设置SortedList不对项目进行排序......

TNX!

Andrej

3 个答案:

答案 0 :(得分:1)

希望我明白你要做的正确。我总是使用通用List<T>而不是ArrayList

创建一个用于存储数据的类:

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

您可以检查列表中是否已存在具有特定ID的项目:

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

您可以获取列表的最后一项:

var lastItem = list.Last();

答案 1 :(得分:1)

像这样做你的对象:

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<T>代替。

答案 2 :(得分:0)

一些方法,有不同的利弊:

如果有匹配的ID,

list.Any(item => item.ID == newItem.ID)会返回true,尽管这与循环相同(实际上因为lambda而稍微贵一点)但代码更清晰。

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

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

如果ID真正识别对象(也就是说,当ID相等时,对象应被视为相等),然后实施IEquatable<T>以基于ID进行比较,覆盖object.Equals()以调用特定于类型的相等方法,并覆盖GetHashCode()以返回ID的值(如果它是int,或者更小的整数类型,或者如果它是int则转换为uint })或ID的哈希码(如果它是一个不同的类型)将意味着这将成为身份的默认概念,这意味着HashSet将不需要特殊的比较器,Contains将为您完成工作(请注意{ {1}}本质上也是一个循环。)