首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在具有相同属性值的两个列表中选择两个比较器

在具有相同属性值的两个列表中选择两个比较器
EN

Stack Overflow用户
提问于 2019-02-19 03:31:54
回答 2查看 44关注 0票数 1

我想要比较两个List<Candidate>,并在Hash属性中选择具有相同值的两个实体。

代码语言:javascript
复制
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();

我希望检索一个具有n.CandidateCp.CandidateC'元素的List<Tuple<Candidate,Candidate>>或类似的对象,并输出类似如下的消息:

代码语言:javascript
复制
 $"Previous Name: {p.CandidateC.Name} to New Name: {n.CandidateC.Name}"

会感谢任何帮助。

EN

回答 2

Stack Overflow用户

发布于 2019-02-19 03:47:33

也许最简单的做法是从以前的候选者创建一个Dictionary并查找每个匹配项:

代码语言:javascript
复制
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来做同样的事情:

代码语言:javascript
复制
var ansj = previousCandidate.Join(newsCandidate, pc => pc.Hash, nc => nc.Hash, (pc, nc) => new { pc, nc });
票数 1
EN

Stack Overflow用户

发布于 2019-02-19 03:51:15

看起来GroupBy可能会很有用:

代码语言:javascript
复制
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>>

代码语言:javascript
复制
List<Tuple<Candidate, Candidate>> tuple = joined
    .Where(g => g.Count() == 2)
    .Select(g => new Tuple<Candidate, Candidate>(g.First(), g.Last()))
    .ToList();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54754142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档