LINQ's Distinct () для определенного свойства

регулярное выражение регулярного URL-адреса django:

regex = re.compile(
        r'^(?:http|ftp)s?://' # http:// or https://
        r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)|' #domain...
        r'localhost|' #localhost...
        r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' # ...or ip
        r'(?::\d+)?' # optional port
        r'(?:/?|[/?]\S+)$', re.IGNORECASE)

print re.match(regex, "http://www.example.com") is not None   # True
print re.match(regex, "example.com") is not None              # False
953
задан Peter Mortensen 16 January 2016 в 18:34
поделиться

6 ответов

РЕДАКТИРОВАНИЕ : Это - теперь часть MoreLINQ.

то, В чем Вы нуждаетесь, "отлично -" эффективно. Я не полагаю, что это - часть LINQ как есть, хотя довольно легко записать:

public static IEnumerable<TSource> DistinctBy<TSource, TKey>
    (this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
    HashSet<TKey> seenKeys = new HashSet<TKey>();
    foreach (TSource element in source)
    {
        if (seenKeys.Add(keySelector(element)))
        {
            yield return element;
        }
    }
}

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

var query = people.DistinctBy(p => p.Id);

И использовать несколько свойств, можно использовать анонимные типы, которые реализуют равенство соответственно:

var query = people.DistinctBy(p => new { p.Id, p.Name });

Непротестированный, но это должно работать (и это теперь, по крайней мере, компилирует).

Это принимает компаратор по умолчанию для ключей, хотя - если Вы хотите передать в компараторе равенства, просто передайте его на HashSet конструктор.

1135
ответ дан Thijs 17 January 2016 в 04:34
поделиться

, Что, если я хочу получить отличный список на основе один или [еще 114] свойства?

Простой! Вы хотите сгруппировать их и выбрать победителя из группы.

List<Person> distinctPeople = allPeople
  .GroupBy(p => p.PersonId)
  .Select(g => g.First())
  .ToList();

, Если Вы хотите определить группы на нескольких свойствах, вот то, как:

List<Person> distinctPeople = allPeople
  .GroupBy(p => new {p.PersonId, p.FavoriteColor} )
  .Select(g => g.First())
  .ToList();
1706
ответ дан Amy B 17 January 2016 в 04:34
поделиться

Необходимо смочь переопределить, Равняется на человеке, чтобы на самом деле сделать, Равняется на Person.id. Это должно привести к поведению, которое Вы после.

0
ответ дан GWLlosa 17 January 2016 в 04:34
поделиться

Можно сделать это (хотя не молния быстро) как так:

people.Where(p => !people.Any(q => (p != q && p.Id == q.Id)));

таким образом, "выбирают все люди, где нет другого другого человека в списке с тем же идентификатором".

, Обратите внимание, в Вашем примере, который просто выбрал бы человека 3. Я не уверен, как сказать, который Вы хотите из предыдущих двух.

5
ответ дан mqp 17 January 2016 в 04:34
поделиться
  • 1
    I' ve добавил некоторое объяснение, как интегрировать Java исходный код SE в Eclipse. Исходный вопрос заставил меня думать он haven' t уже сделанный это, в то время как it' s НЕОБХОДИМОСТЬ для каждого Java-разработчика. – BalusC 3 November 2009 в 18:05

Я написал статью, которая объясняет, как расширить Отличную функцию так, чтобы можно было сделать следующим образом:

var people = new List<Person>();

people.Add(new Person(1, "a", "b"));
people.Add(new Person(2, "c", "d"));
people.Add(new Person(1, "a", "b"));

foreach (var person in people.Distinct(p => p.ID))
    // Do stuff with unique list here.

Вот статья: Расширение LINQ - Определение Свойства в Отличной Функции

11
ответ дан Peter Mortensen 17 January 2016 в 04:34
поделиться
    List<string> colors = new List<string> { "blue", "red", "black", "blue", "yellow", "blue" };
    IEnumerable<string> distinctColors = colors.Distinct();
0
ответ дан uguronline 29 August 2019 в 16:30
поделиться
Другие вопросы по тегам:

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