Часто возникает потребность отфильтровать одинаковые элементы в списке. В LINQ есть метод Distinct, который получает интерфейс IEqualityComparer. Не совсем понятно, почему метод не может получать lamda-выражение. Следующий код должен исправить положение:
class EqualityComparer : IEqualityComparer
{
public Func DistinctDelegate;
public bool Equals(T x, T y)
{
return DistinctDelegate(x).ToString() == DistinctDelegate(y).ToString();
}
public int GetHashCode(T obj)
{
return obj.ToString().ToLower().GetHashCode();
}
}
public static IEnumerable Distinct(this IEnumerable coll, Func distinctDelegate)
{
EqualityComparer myd = new EqualityComparer();
myd.DistinctDelegate = distinctDelegate;
return coll.Distinct(myd);
}
public static IQueryable Distinct(this IQueryable coll, Func distinctDelegate)
{
EqualityComparer myd = new EqualityComparer();
myd.DistinctDelegate = distinctDelegate;
return coll.Distinct(myd);
}
Первый метод используется для Linq2Object, второй — Linq2SQL.
Использование:
var words = from x in new[] { "dog", "cat", "cat" } select new { Word = x };
var distinctWords = words.Distinct(x => x.Word);
Код предоставил Владимир Калошин.
Похожие статьи
- 19 сентября 2010 -- StringTemplate на C# (Часть 2) (0)
- 23 сентября 2011 -- Конфигурационные секции. Web.config и App.config для «C# продолжающих». (0)
- 8 марта 2011 -- C#: Silverlight таймаут (Timeout) (2)
- 31 августа 2009 -- CRUD на SQLite (5)
- 18 декабря 2008 -- Транслитерация RUS 2 LAT на C# (22)
24 апреля, 2009 at 13:51
Добрый день,
Вопрос, косвенно связанный с постом, но напрямую — с блогом 🙂
Если сформулировать вкратце, то как сделать ObjectTrackingEnabled=false и SubmitChanges одновременно?
Т.е. если я извлекаю какие-то данные конструкцией select c, затем в другом приложении меняю эти данные, и читаю в исходном снова — они не меняются, LINQ соханяет их в текущий кэш.
Refresh объекта делать не всегда возможно (например, я удалил запись). Создавать каждый раз новый контекст — забить память (dispose не приводит к немедленному освобождению памяти).
А как Вы строите многопользовательские приложения?
28 апреля, 2009 at 8:46
Здравствуйте Роман.
Начну снизу. Обычно, в многопользовательских приложениях я разделаю уровень данных и интерфейс каналом WCF.
Если задание требует .NET2.0 использую NHiretnate. Я не слышал в LINQ2SQL об использовании кеша, в NHibernate например из 2 и настраиваются они
на уровне SesssionFactory. Когда только начинал использовать LINQ, DataContext выдавал массу ошибок при использовании его как синглтон.
Сейчас создаю новый DataContext для каждой задачи, плюс транзакции. В обоих случаях LINQ2SQL или NHibernate, для обновления данных в базе,
нужно вызвать соответствующие методы.
Добрый коллега, некоторое время назад, вел дискуссию с господином Альбахари (http://www.albahari.com/ ), оба согласились с тем, что Linq2SQL и также/791-linq-ins.....o-reshenie )
EntityFramwork имеют «недоработки» именно с ObjectTrackingEnabled и SubmitChanges. Небольшой пример и описание проблемы по моему было здесь (
Надеюсь я смог ответить на ваш вопрос 🙂
28 апреля, 2009 at 10:45
Продолжу традицию «Снизу» 🙂
Метод InsertOrUpdateOnSubmit не работает если данные обновлены в другой копии приложения, нужна скорее перегрузка методов select.
Создавать отдельный DataContext — собственно так и поступаю, но не могу освободить от него память, Dispose, приравнивание в null и сборка мусора не помогают, поэтому память в процессе работы только растет.
NHibernate наверное несколько поздновато т.к. довольно объемное приложение реализовано на LINQ2SQL.
А что за методы используете для обновления данных? Как понимаю это врядли Refresh, т.к. он работает только для конкретных объектов.