Взгляните на Кроме метод, который Вы используете как это:
var resultingList =
listOfOriginalItems.Except(listOfItemsToLeaveOut, equalityComparer)
Вы захотите использовать перегрузку, с которой я связался, который позволяет Вам указать пользовательский IEqualityComparer. Тем путем можно указать, как объекты соответствуют на основе составного ключа. (Если Вы уже переопределили, Равняется, тем не менее, Вам не должен быть нужен IEqualityComparer.)
Редактирование: , Так как кажется, что Вы используете два различных типов классов, вот иначе, который мог бы быть более простым. Принятие List<Person>
названный persons
и List<Exclusion>
названный exclusions
:
var exclusionKeys =
exclusions.Select(x => x.compositeKey);
var resultingPersons =
persons.Where(x => !exclusionKeys.Contains(x.compositeKey));
, Другими словами: Выберите из исключений просто ключи, затем выберите от людей, весь Человек возражает, что не делают , имеют любой из тех ключей.
Я просто использовал бы метод FindAll на классе Списка. т.е.:
List<Person> filteredResults =
people.FindAll(p => return !exclusions.Contains(p));
Не уверенный, если синтаксис будет точно соответствовать Вашим объектам, но я думаю, что Вы видите, куда я иду с этим.
Можно использовать "Кроме" дополнительного метода (см. http://msdn.microsoft.com/en-us/library/bb337804.aspx )
В коде
var difference = people.Except(exclusions);
Большое спасибо за это парни.
я mangaged для снижения этого к одной строке:
var results = from p in People
where !(from e in exclusions
select e.CompositeKey).Contains(p.CompositeKey)
select p;
Еще раз спасибо все.
Я не мог выяснить, как сделать это в чистом MS LINQ, таким образом, я записал свой собственный дополнительный метод, чтобы сделать это:
public static bool In<T>(this T objToCheck, params T[] values)
{
if (values == null || values.Length == 0)
{
return false; //early out
}
else
{
foreach (T t in values)
{
if (t.Equals(objToCheck))
return true; //RETURN found!
}
return false; //nothing found
}
}
Я сделал бы что-то вроде этого, но я держал пари, что существует более простой путь. я думаю, что sql от linqtosql использовал бы выбор от человека, Где НЕ СУЩЕСТВУЮТ (выбор из Вашего списка исключения)
static class Program
{
public class Person
{
public string Key { get; set; }
public Person(string key)
{
Key = key;
}
}
public class NotPerson
{
public string Key { get; set; }
public NotPerson(string key)
{
Key = key;
}
}
static void Main()
{
List<Person> persons = new List<Person>()
{
new Person ("1"),
new Person ("2"),
new Person ("3"),
new Person ("4")
};
List<NotPerson> notpersons = new List<NotPerson>()
{
new NotPerson ("3"),
new NotPerson ("4")
};
var filteredResults = from n in persons
where !notpersons.Any(y => n.Key == y.Key)
select n;
foreach (var item in filteredResults)
{
Console.WriteLine(item.Key);
}
}
}
Этот LINQ ниже генерирует SQL для левого внешнего объединения и затем возьмет все результаты, которые не находят соответствие в Вашем списке исключения.
List<Person> filteredResults =from p in people
join e in exclusions on p.compositeKey equals e.compositeKey into temp
from t in temp.DefaultIfEmpty()
where t.compositeKey == null
select p
сообщает мне, работает ли это!