I'm currently working on a .NET application. I need to write a LINQ query to filter a List<SearchResult>
given in the example below.
Allowed are the combinations of CompanyId ContactId or CompanyId (without ContactId) as a key for the result, the entries in the result list must be distinct.
The key in the result list is a combination of unique "CompanyID ContactId" OR unique "CompanyID". As an example, in the result list as a key I can have one "companyID 1", and several "companyID 1" ContactID (1, 2, 3, ...) BUT eacht ContactID only one time in combination with one CompanyID i.e. {1},{1, 1}, {1, 2}, {1, 3}
but not a second time {1, 1}
or {1}
.
public class SearchResult
{
public int? CompanyId {get; set;}
public int? ContactId {get; set;}
}
public class Program
{
public static void Main()
{
var searchResults = new List<SearchResult>
{
new SearchResult { CompanyId = 1, ContactId = 1 }, // yes
new SearchResult { CompanyId = 2, ContactId = 3 }, // yes
new SearchResult { CompanyId = 2, ContactId = 4 }, // yes
new SearchResult { CompanyId = 1 }, // yes
new SearchResult { CompanyId = 2 }, // yes
new SearchResult { CompanyId = 1, ContactId = 1 }, // no
new SearchResult { CompanyId = 1 }, // no
new SearchResult { }, // no
new SearchResult { CompanyId = null }, // no
new SearchResult { CompanyId = null, ContactId = null }, // no
new SearchResult { ContactId = null }, // no
};
// Unfortunately my LINQ query doesn't work correctly
var result = searchResults
.GroupBy(sr => sr.CompanyId)
.Select(grp => grp.First());
foreach(SearchResult sr in result){
Console.WriteLine(sr.CompanyId " " sr.ContactId);
}
}
}
My current LINQ query doesn't work correctly - it's also quite basic. I only get the result: [{1, 1},{2, 3}]
, it's really tricky.
Though the desired result should be [{1, 1},{2, 3},{2, 4}, {1},{2}]
.
Do you know how to retrieve the correct result?
CodePudding user response:
Very close, however .GroupBy
both CompanyId
and ContactId
(instead of just CompanyId
) & then get the non-dupes using .First()
.
var result = searchResults
.GroupBy(sr => new { sr.CompanyId, sr.ContactId })
.Select(x => x.First());