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
РЕДАКТИРОВАНИЕ : Это - теперь часть 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
конструктор.
, Что, если я хочу получить отличный список на основе один или [еще 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();
Необходимо смочь переопределить, Равняется на человеке, чтобы на самом деле сделать, Равняется на Person.id. Это должно привести к поведению, которое Вы после.
Можно сделать это (хотя не молния быстро) как так:
people.Where(p => !people.Any(q => (p != q && p.Id == q.Id)));
таким образом, "выбирают все люди, где нет другого другого человека в списке с тем же идентификатором".
, Обратите внимание, в Вашем примере, который просто выбрал бы человека 3. Я не уверен, как сказать, который Вы хотите из предыдущих двух.
Я написал статью, которая объясняет, как расширить Отличную функцию так, чтобы можно было сделать следующим образом:
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 - Определение Свойства в Отличной Функции
List<string> colors = new List<string> { "blue", "red", "black", "blue", "yellow", "blue" };
IEnumerable<string> distinctColors = colors.Distinct();