Сравнение arraylist c # - PullRequest
       15

Сравнение arraylist c #

1 голос
/ 30 сентября 2010

в c #, если у меня есть такой массив данных (ID, ITEMQUANTITY), и я хотел бы сравнить их по ID, как бы я это сделал?Я имею в виду, мне нужно настроить его так, чтобы я мог сравнить его только по первому значению, поэтому, если я хочу вставить другой элемент, я могу проверить, есть ли идентификатор в списке .... Я знаю, как это сделать,циклически просматривая все элементы в массиве, но я помню, как делал это на Java некоторое время назад с переопределением какого-либо интерфейса или методов или чего-то еще ...

В настоящее время я использую SortedList, который я могу сравнить с помощью KEY of (КЛЮЧ, ЗНАЧЕНИЕ).Но проблема в том, что я не хочу, чтобы элементы сортировались ... Я хочу, чтобы последний был помещен на последнее место.Может быть, я могу обойти преобразование в arraylist, если бы я мог просто установить SortedList, чтобы он не сортировал элементы ...

Tnx!

Andrej

Ответы [ 3 ]

1 голос
/ 30 сентября 2010

Сделайте ваш объект таким:

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>.

1 голос
/ 30 сентября 2010

Надеюсь, я понимаю, что вы пытаетесь сделать правильно. Я бы всегда использовал общий 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 });

Вы можете проверить, существует ли элемент с определенным идентификатором в списке:

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

Вы можете получить последний элемент списка:

var lastItem = list.Last();
0 голосов
/ 30 сентября 2010

Несколько подходов, с разными плюсами и минусами:

list.Any(item => item.ID == newItem.ID) возвращает true, если есть совпадающий идентификатор, хотя это то же самое, что и цикл (и действительно немного дороже из-за лямбды), но чищеcode.

Поддержание HashSet, в котором компаратор сравнивает свойство ID, будет означать, что новые значения с существующим идентификатором не будут добавлены.

Сохранение списка в порядке идентификаторов позволит вам быстролибо найдите существующий объект в O (log n) сложности времени, используя BinarySearch(), либо найдите место, куда вы должны вставить этот новый элемент для поддержания порядка.

Если ID действительно идентифицирует объекты (то естьскажем, когда идентификаторы равны, объекты следует считать равными), затем реализуем IEquatable<T> для сравнения на основе идентификатора, переопределяем object.Equals() для вызова в этот метод равенства для конкретного типа и переопределяем GetHashCode() для возврата значенияID (если это int, или меньший целочисленный тип, или приведение к int, если это uint) или хэш-код ID (если это 'Это другой тип) будет означать, что это становится концепцией идентичности по умолчанию, то есть HashSet не будет нуждаться в специальном компараторе, и Contains сделает всю работу за вас (обратите внимание, что Contains, по сути, тоже цикл).

...