Выберите два компаратора в двух списках с одинаковым значением свойства - PullRequest
0 голосов
/ 18 февраля 2019

Я хочу сравнить два List<Candidate> и выбрать оба объекта с одинаковым значением в свойстве Hash.

public class  Candidate : IEquatable<Candidate>
{
    public string Name { get; set; }
    public String Hash { get; set; }
}

//....

//List with "CandidateA", "CandidateB", "CandidateC" values
List<Candidate> newsCandidate = loadNewsCandidate();

//List with "CandidateC' " , "CandidateD", "CandidateE" values
List<Candidate> previousCandidate = loadPreviousCandidate();

//CandidateC and CandidateC' has same 'Hash' value.

//This return "CandidateC" in newsCandidate
var common = newsCandidate.Where(n => previousCandidate.Any(p => p.Hash.Equals(n.Hash))).ToList();

Я хочу получить List<Tuple<Candidate,Candidate>> или аналогичный элемент с элементами n.CandidateC иp.CandidateC' и выводит сообщение, подобное:

 $"Previous Name: {p.CandidateC.Name} to New Name: {n.CandidateC.Name}"

Будет признательна за любую помощь.

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Кажется, GroupBy может быть полезно:

var p = new List<Candidate> 
{ 
    new Candidate { Name = "John", Hash = "1" }, 
    new Candidate { Name = "Mike", Hash = "2" } 
};

var n = new List<Candidate> 
{ 
    new Candidate { Name = "Mike", Hash = "1" }, 
    new Candidate { Name = "John", Hash = "2" } 
};

var joined = p.Concat(n).GroupBy(item => item.Hash);

Console.WriteLine(string.Join("\n", joined
    .Where(g => g.Count() == 2)
    .Select(g => $"Old name {g.First().Name}, New name {g.Last().Name}")));

// Old name John, new name Mike
// Old name Mike, new name John

или просто сделать List<Tuple<Candidate, Candidate>> с:

List<Tuple<Candidate, Candidate>> tuple = joined
    .Where(g => g.Count() == 2)
    .Select(g => new Tuple<Candidate, Candidate>(g.First(), g.Last()))
    .ToList();
0 голосов
/ 18 февраля 2019

Пожалуй, самое простое, что можно сделать, это создать Dictionary из предыдущих кандидатов и просмотреть каждый матч:

var prevDict = previousCandidate.ToDictionary(pc => pc.Hash);
var ans = newsCandidate.Select(nc => prevDict.TryGetValue(nc.Hash, out var pc) ? new { pc, nc } : null).Where(pcnc => pcnc != null);

Если вы предпочитаете не создавать свой собственный Dictionary, вы можететакже используйте LINQ Join, чтобы сделать то же самое:

var ansj = previousCandidate.Join(newsCandidate, pc => pc.Hash, nc => nc.Hash, (pc, nc) => new { pc, nc });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...