Nano Hash - криптовалюты, майнинг, программирование

Мне нужно удалить дубликаты из списка‹›

У меня есть List<CreditCard>, свойство кредитной карты CreditCardNumber, которое является строкой. К сожалению, это может быть 1234 1234 1234 1234 или 1234123412341234, которые являются одним и тем же числом.

Мне нужно просмотреть и удалить эти повторяющиеся элементы. Может ли кто-нибудь помочь?

12.11.2012

  • как 1234 может быть таким же, как 1234123412341234? 13.11.2012
  • @gdoron это о космосе 13.11.2012
  • он имел в виду, что "1234 1234 1234 1234" совпадает с "1234123412341234". 13.11.2012
  • Можно ли изменить CreditCard класс? 13.11.2012
  • @Андрей. Ну... после того, как кто-то отредактирует, станет ясно. 13.11.2012
  • @Craig, а как насчет других свойств кредитной карты? Если у нас есть две кредитные карты с одинаковым номером, но другие свойства будут разными - какую карту выбрать? 13.11.2012
  • пс. вероятно, лучше удалить все пробелы из строки, когда вы присваиваете значение CreditCardNumber; в противном случае вы будете нести накладные расходы каждый раз, когда будете сравнивать это число, и, по-видимому, пробелы в вашей программе не имеют смысла. В качестве альтернативы вы можете сохранить копию исходного ввода в одной переменной, но кэшировать преобразованную копию в другой - крошечное попадание в память для небольшого прироста производительности. 13.11.2012

Ответы:


1

Лучшим вариантом будет убрать пробелы из номера карты при вводе, чтобы операцию очистки пришлось выполнить только один раз:

    public class CreditCard: IComparable<CreditCard>
    {
        string creditCardNumberClean;
        string creditCardNumberOriginal;
        public string CreditCardNumber
        {
            get 
            { 
                return this.creditCardNumberOriginal; 
            }
            set
            {
                this.creditCardNumberOriginal = value;
                this.creditCardNumberClean = value.Replace(" ", "");
            }
        }
        public CreditCard(string creditCardNumber)
        {
            this.CreditCardNumber = creditCardNumber;
        }

        public int CompareTo(CreditCard other)
        {
            return this.creditCardNumberClean.CompareTo(other.creditCardNumberClean);
        }
    }

Но если это невозможно, вы в основном хотите выполнить сравнение строк по номеру карты, просто изменив номер, чтобы удалить все пробелы перед сравнением:

    class Program
    {
        public static void Main(string[] args) 
        {
            List<string> list = new List<string>(new string[]{"1234 1234 1234 1234", "1234123412341234","9999 9999 9999 9999"});
            SortedSet<string> set = new SortedSet<string>(list, new CreditCardNoComparer());
            foreach (string s in set)
            {
                Console.WriteLine(s);
            }
            Console.ReadKey();
        }
    }
    public class CreditCardNoComparer : IComparer<string>
    {
        public int Compare(string x, string y)
        {
            return x.Replace(" ", "").CompareTo(y.Replace(" ", ""));
        }

    }

ИЗМЕНИТЬ

//version using overridden GetHashCode and Equals methods as per @lazyberezovsky's comments 
public class CreditCard
{
    long creditCardNumberClean; //given the card number is numeric this is the most efficient way of storing it
    string creditCardNumberOriginal;
    public string CreditCardNumber
    {
        get
        {
            return this.creditCardNumberOriginal;
        }
        set
        {
            this.creditCardNumberOriginal = value;
            this.creditCardNumberClean = long.Parse(value.Replace(" ", "")); 
        }
    }
    public CreditCard(string creditCardNumber)
    {
        this.CreditCardNumber = creditCardNumber;
    }
    public override bool Equals(object obj)
    {
        CreditCard other = obj as CreditCard;
        return 
            other == null 
            ? false 
            : this.creditCardNumberClean.Equals(other.creditCardNumberClean);
    }
    public override int GetHashCode()
    {
        return this.creditCardNumberClean.GetHashCode();
    }
}
12.11.2012
  • +1 Лучшее решение - избавиться от различного представления ключей. Но я бы, наверное, выбрал Equals (сравните числа) и GetHashCode (числовой код). 13.11.2012
  • Спасибо @lazyberezovsky; согласились с тем, что переопределение Equals и GetHashCode является лучшим подходом; Я обновлю свой пример. . . 13.11.2012

  • 2
    1. Удалите пробелы из каждого
    2. Используйте 1_
    12.11.2012

    3

    Сначала вы должны определить, что представляет собой «равный». Если это так же просто, как удаление встроенных пробелов, вы можете использовать одно из предыдущих решений, которое удаляет пробелы и вызывает Distinct. В противном случае вам придется создать компаратор равенства и передать его в перегрузку Distinct.

    12.11.2012

    4

    Вы можете создать свой собственный EqualityComparer для CreditCard, который удаляет пробелы, и использовать Enumerable.Distinct для удаления дубликатов:

    public class CardComparer : IEqualityComparer<CreditCard>
    {
        private readonly Regex re = new Regex(@"\s+");
    
        public bool Equals(CreditCard x, CreditCard y)
        {
            return re.Replace(x.Number, "") == re.Replace(y.Number, "");
        }
    
        public int GetHashCode(CreditCard obj)
        {
            return re.Replace(obj.Number, "").GetHashCode();
        }
    }
    

    Потом:

    IEnumerable<CreditCard> unique = sourceList.Distinct(new CardComparer());
    
    12.11.2012
  • Он не совсем возвращает список. 13.11.2012


  • 6
  • Черт, ты меня опередил. :) Да, используйте это. :) 13.11.2012
  • Технически ОП хочет отдельный список CreditCard, а не string 13.11.2012
  • 12 34123 4 123 41234 — это то же самое, что 1234123412341234? 13.11.2012
  • @Андрей. Хороший вопрос, но я считаю, что кредитные карты, где вы ставите пробелы, не имеют большого значения... 13.11.2012
  • Но это меняет коллекцию. Я предполагаю, что ОП не хочет изменять список, он просто хочет сравнить игнорирование пробелов. Может быть, он хочет сохранить пробельные числа, такие как 1234 1234 1234 1234 или первый из каждого списка дубликатов. 13.11.2012
  • Что вы делаете со своим списком строк? Присоединить их обратно в список кредитных карт? Мне кажется грязным. 13.11.2012
  • Имхо, лучшим подходом был бы пользовательский IEqualityComparer<CreditCard> для Enumerable.Distinct. 13.11.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..