I will assume that there is a simple LINQ query that can do this, but I'm not sure how.
Give this Code:
class Program { static void Main(string[] args) { List<Person> peopleList1 = new List<Person>(); peopleList1.Add(new Person() { ID = 1 }); peopleList1.Add(new Person() { ID = 2 }); peopleList1.Add(new Person() { ID = 3 }); List<Person> peopleList2 = new List<Person>(); peopleList2.Add(new Person() { ID = 1 }); peopleList2.Add(new Person() { ID = 2 }); peopleList2.Add(new Person() { ID = 3 }); peopleList2.Add(new Person() { ID = 4 }); peopleList2.Add(new Person() { ID = 5 }); } } class Person { public int ID { get; set; } }
I want to perform LINQ queries so that I am not in peopleList1 in peopleList2.
This example should give me two people (ID = 4 & ID = 5)
#1 building
This is a job example that can acquire IT skills that the candidate does not have yet.
//Get a list of skills from the Skill table IEnumerable<Skill> skillenum = skillrepository.Skill; //Get a list of skills the candidate has IEnumerable<CandSkill> candskillenum = candskillrepository.CandSkill .Where(p => p.Candidate_ID == Candidate_ID); //Using the enum lists with LINQ filter out the skills not in the candidate skill list IEnumerable<Skill> skillenumresult = skillenum.Where(p => !candskillenum.Any(p2 => p2.Skill_ID == p.Skill_ID)); //Assign the selectable list to a viewBag ViewBag.SelSkills = new SelectList(skillenumresult, "Skill_ID", "Skill_Name", 1);
#2 building
Or, if you want it without any Negation:
var result = peopleList2.Where(p => peopleList1.All(p2 => p2.ID != p.ID));
Basically, all information is obtained from peopleList2, where all ID S in peopleList1 are different from those in peopleList2.
Slightly different from the accepted answer:)
#3 building
It's a bit late for the party, but a good solution for SQL compatible Linq is:
List<string> list1 = new List<string>() { "1", "2", "3" }; List<string> list2 = new List<string>() { "2", "4" }; List<string> inList1ButNotList2 = (from o in list1 join p in list2 on o equals p into t from od in t.DefaultIfEmpty() where od == null select o).ToList<string>(); List<string> inList2ButNotList1 = (from o in list2 join p in list1 on o equals p into t from od in t.DefaultIfEmpty() where od == null select o).ToList<string>(); List<string> inBoth = (from o in list1 join p in list2 on o equals p into t from od in t.DefaultIfEmpty() where od != null select od).ToList<string>();
Thank http://www.dotnet-tricks.com/Tutorial/linq/UXPF181012-SQL-Joins-with-C
#4 building
This Enumerable Extension allows you to define a list of items to exclude and functions to find the key used to perform the comparison.
public static class EnumerableExtensions { public static IEnumerable<TSource> Exclude<TSource, TKey>(this IEnumerable<TSource> source, IEnumerable<TSource> exclude, Func<TSource, TKey> keySelector) { var excludedSet = new HashSet<TKey>(exclude.Select(keySelector)); return source.Where(item => !excludedSet.Contains(keySelector(item))); } }
You can use it like this
list1.Exclude(list2, i => i.ID);
#5 building
var result = peopleList2.Where(p => !peopleList1.Any(p2 => p2.ID == p.ID));