Идеальный метод сокращения c # для значений одного типа с побитовым подходом? - PullRequest
1 голос
/ 24 февраля 2012

Добрый день всем,

У меня есть класс и свойство, и у меня есть три экземпляра этого класса.

public class myclass {
  public int myproperty;
}

...

myclass inst1, inst2, inst3;

...

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

Так что если у меня есть

inst1.myproperty = 3;
inst2.myproperty = 5;
inst3.myproperty = 3;

после magic_function_call, я должен получить 3 и5.

И если после magic_function_call у меня будет

inst1.myproperty = 2;
inst2.myproperty = 2;
inst3.myproperty = 2;

, я получу 2.

Хотя это само по себе тривиально и может быть решено с помощью любого количестваЕсли проверки выполнялись по мере необходимости, мне было интересно, какой это самый быстрый или более эффективный способ сделать это, особенно в свете того факта, что в будущем мне может понадобиться добавить еще одну переменную для проверки.

Яна самом деле интересно, есть ли побитовая операция, которая может быть выполнена, чтобы решить эту проблему элегантно и быстро.

В качестве альтернативы, есть ли операция массива, которая может использоваться для достижения той же цели?Я пытался найти «сокращение» или «сжатие», но эти ключевые слова, кажется, не приводят в правильном направлении.

Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 24 февраля 2012

Вы можете использовать оператор запроса morelinq DistinctBy, если все экземпляры принадлежат коллекции:

List<MyClass> myList = new List<MyClass>();
.. populate list
List<MyClass> distinct = myList.DistinctBy(mc => mc.myproperty).ToList();

Глядя на вопрос, вам может потребоваться список толькозначения свойств (список целых), которые вы можете получить с помощью стандартных операторов запросов:

List<int> distinct = myList.Select(mc => mc.myproperty).Distinct().ToList();

Обратите внимание, что вы не определили свойство, вы определили открытое поле.Чтобы определить автоматическое изменение свойства:

public int myproperty;

на

public int myproperty { get; set; }

Обратите также внимание, что PascalCasing рекомендуется для имен свойств и классов.

1 голос
/ 24 февраля 2012

Вот быстрая функция, которая не требует дополнительных библиотек и позволяет избежать затрат на установку и накладных расходов, связанных с LINQ:

    static int[] Reduce(IEnumerable<myclass> items)
    {
        HashSet<int> uniqueValues = new HashSet<int>();

        foreach (var item in items)
        {
            uniqueValues.Add(item.myproperty);
        }

        return uniqueValues.ToArray();
    }

Передайте ей коллекцию ваших экземпляров myclass, и она вернет массивуникальные значения myproperty.

1 голос
/ 24 февраля 2012

Просто еще один способ реализовать это.

var result = myList.GroupBy(p => p.myproperty).Select(p => p.First());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...