gpt4 book ai didi

c# - 在不同的通用 List 中搜索常见项目,我怎样才能做得更好?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:45:27 24 4
gpt4 key购买 nike

我有一个模拟人的类;除了通常的属性之外,还有那个人的手机号码

public class Person
{
// Other properties elided here for brevity's sake
public string PersonMobileNumber { get; set; }
}

向该人发送短信,他们可能会回复也可能不会回复。我这样定义了一条消息:

public class SmsMessage
{
public string NumberFrom { get; set;}
public string NumberTo { get; set;}
public string MessageContent { get; set; }
public DateTime DateTimeReceived { get; set; }
}

现在我想看看谁回复了我的短信。

用简单的英语来说,您有许多 SMS 消息 (List<SmsMessage>) 和一些人 (List<Person>)

在旧的 LINQ 之前的日子里,我只需要 foreached我通过这两个系列的方式,其中一个 foreach在第一个里面,但我认为 LINQ 应该可以在这里帮助我。我提出的相关声明如下所示:

List<Person> peopleThatResponded =
people.Where(p => smsMessages.Exists(s => s.NumberFrom == p.MobileNumber)).ToList();

我只是觉得这对于小数据集来说效果很好(这是基于调试它并观察代码的循环),但我确信有一种更高效的方法可以做到这一点。 FWIW 我可以完全控制类定义,并且可以进行任何需要进行的更改。

最佳答案

一个更有效的方法是加入他们:

var peopleThatResponded = from pers in people
join sms in smsMessages
on pers.PersonMobileNumber equals sms.NumberFrom
select pers;
List<Person> peopleListThatResponded = peopleThatResponded.ToList();

Why is LINQ JOIN so much faster than linking with WHERE?

但是,如果人们已经多次回复,那将是重复的。另一种方法是使用 HashSet<string>而不是效率更高的列表。

var smsNumbers = new HashSet<string>(smsMessages.Select(sms => sms.NumberFrom));
List<Person> peopleThatResponded = people
.Where(p => smsNumbers.Contains(p.PersonMobileNumber)).ToList();

关于c# - 在不同的通用 List<T> 中搜索常见项目,我怎样才能做得更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25640460/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com