Получить все элементы, которые встречаются только один раз

Могу ли я с помощью LINQ получить список всех элементов типа int, которые встречаются только один раз?

Например

{1,2,4,8,6,3,4,8,8,2}

станет

{1,6,3}

Спасибо!


person Wilson    schedule 12.03.2013    source источник


Ответы (2)


var result =
    from x in xs
    group xs by x into grp
    where grp.Count() == 1
    select grp.Key;

как это?

на 50 секунд позже... :/

person D.R.    schedule 12.03.2013
comment
@lazyberezovsky +1 за честность :p - person bas; 13.03.2013

Различные методы расширения, которые вы можете использовать:

public static IEnumerable<T> WhereUnique<T>(this IEnumerable<T> items)
{
    return items.GroupBy(x => x).Where(x => x.Count() ==1).Select(x => x.First());
}

возможно, немного более производительный, в зависимости от распределения ваших данных:

public static IEnumerable<T> WhereUnique<T>(this IEnumerable<T> items)
{
    return items.GroupBy(x => x).Where(x => !x.Skip(1).Any()).Select(x => x.First());
}

И WhereUniqueBy, который работает аналогично MoreLinqs DistinctBy():

public static IEnumerable<T> WhereUniqueBy<T, TSelector>(this IEnumerable<T> items, Func<T, TSelector> func)
{
    return items.GroupBy(func).Where(x => x.Count() ==1).Select(x => x.First());
}
person Yair Halberstadt    schedule 21.08.2018