Выбор уникальных элементов из списка в C#

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

19
задан Ozgur Ozcitak 7 March 2012 в 08:26
поделиться

6 ответов

var numbers = new[] { 0, 1, 2, 2, 2, 3, 4, 4, 5 };

var uniqueNumbers =
    from n in numbers
    group n by n into nGroup
    where nGroup.Count() == 1
    select nGroup.Key;

// { 0, 1, 3, 5 }
32
ответ дан 30 November 2019 в 01:50
поделиться
var nums = new int{ 0...4,4,5};
var distinct = nums.Distinct();

удостоверяются, что Вы используете Linq и платформу.NET 3.5.

17
ответ дан 30 November 2019 в 01:50
поделиться

Решение C# 2.0:

static IEnumerable<T> GetUniques<T>(IEnumerable<T> things)
{
    Dictionary<T, int> counts = new Dictionary<T, int>();

    foreach (T item in things)
    {
        int count;
        if (counts.TryGetValue(item, out count))
            counts[item] = ++count;
        else
            counts.Add(item, 1);
    }

    foreach (KeyValuePair<T, int> kvp in counts)
    {
        if (kvp.Value == 1)
            yield return kvp.Key;
    }
}
10
ответ дан 30 November 2019 в 01:50
поделиться

С лямбдой..

var all = new[] {0,1,1,2,3,4,4,4,5,6,7,8,8}.ToList();
var unique = all.GroupBy(i => i).Where(i => i.Count() == 1).Select(i=>i.Key);
12
ответ дан 30 November 2019 в 01:50
поделиться

Если Linq не доступен Вам, потому что необходимо поддерживать унаследованный код, который не может быть обновлен, то объявить Словарь, где первый интервал является числом, и второй интервал является количеством происшествий. Цикл через Ваш Список, загружая Ваш Словарь. Когда Вы сделаны, цикл через Ваш Словарь, выбирающий только те элементы, где количество происшествий равняется 1.

3
ответ дан 30 November 2019 в 01:50
поделиться

Я полагаю, что Matt означал говорить:

 static IEnumerable<T> GetUniques<T>(IEnumerable<T> things)
 {
     Dictionary<T, bool> uniques = new Dictionary<T, bool>();
     foreach (T item in things)
     {
         if (!(uniques.ContainsKey(item)))
         {
             uniques.Add(item, true);
         }
     }
     return uniques.Keys;
 }
3
ответ дан 30 November 2019 в 01:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: