【问题标题】:Comparing arraylist c#比较arraylist c#
【发布时间】:2010-09-30 10:15:07
【问题描述】:

在 c# 中,如果我填充了一个类似 (ID, ITEMQUANTITY) 的数组列表,并且我想按 ID 比较它们,我该怎么做? 我的意思是,我需要自定义它,以便我可以仅通过第一个值比较它,所以如果我想插入另一个项目,我可以检查 id 是否已经在列表中...... 我知道如何通过循环遍历数组列表中的所有项目来做到这一点,但我记得不久前在 Java 中这样做并覆盖了一些接口或方法或其他东西......

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

Tnx!

安德烈

【问题讨论】:

  • 既然您在谈论可能使用不同的集合类型:除非您的目标是 .NET 1.1 或者您被接口强制,否则今天没有理由仍然使用 ArrayList。请改用通用 List<T>(或来自 System.Collections.Generic 的其他通用集合之一。

标签: c# arraylist sortedlist


【解决方案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();

【讨论】:

    【解决方案2】:

    这样做你的对象:

    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&lt;T&gt;

    【讨论】:

      【解决方案3】:

      几种方法,各有利弊:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2015-06-02
        • 1970-01-01
        • 2011-03-27
        • 2013-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-07
        相关资源
        最近更新 更多