加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 从列表中选择

发布时间:2020-12-16 00:16:16 所属栏目:百科 来源:网络整理
导读:我确定有一种很好的方法可以做到这一点(我猜测其中一种扩展方法?),但我很难在Google上找到它. 基本上我有一个自定义类列表;我想从中选择一些项目到一个新的List中,其中一个属性等于另一个List中的任何值. 这是我正在尝试做的一个(简化)快速示例: public cl
我确定有一种很好的方法可以做到这一点(我猜测其中一种扩展方法?),但我很难在Google上找到它.

基本上我有一个自定义类列表;我想从中选择一些项目到一个新的List中,其中一个属性等于另一个List中的任何值.

这是我正在尝试做的一个(简化)快速示例:

public class Job
    {
        public int Number;
        public string ClientCompanyName;            
    }

List<Job> lstJobs = new List<Job>();
List<Job> lstCompare = new List<Job>();

通常我会这样做:

List<Job> lstFiltered = new List<Job>();
foreach(Job jobThis in lstCompare)
{
    foreach(jobComp in lstCompare)
    {
        if(jobThis.Number = jobComp.Number)
        {
            lstFiltered.Add(jobThis);
        }
    }
}

是否有一种扩展方法可以将最后一位加入(理想情况下)单行?

干杯

解决方法

var lstFiltered = lstJobs
        .Where(job => lstCompare.Any(item => item.Number == job.Number))
        .ToList();

如果lstCompare中的项目数量很少,则上述解决方案很有效.对于更大的比较列表,您可能希望使用一些基于散列的集合.

var compareSet = new HashSet<int>(lstCompare.Select(item => item.Number));
var lstFiltered = lstJobs
        .Where(job => compareSet.Contains(job.Number))
        .ToList();

如果比较条件更复杂或者在几个地方需要它,则应创建一个实现IEqualityComparer< T>的比较器类.然后你可以像其他人已经建议的那样使用Intersect()方法.但是,它在功能上与上述解决方案不同.当我的解决方案返回所有匹配元素时,它只返回不同的元素在某些应用中,这可能是一个显着的差异.

我的第二个例子可以很容易地改为使用IEqualityComparer< T>如有必要. HashSet< T>将比较器作为第二个参数.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读