LINQ,检查列表中哪些元素与另一个列表相比较

时间:2016-12-14 15:14:07

标签: c# linq

我有两个列表,一个是所有语言,另一个是该网站的语言子集,其目的是返回所有语言,但如果子集的元素对应于所有语言的列表,则更改布尔值的属性

语言的DTO:

public class DTOLanguage
{

    public bool HaveLanguage { get; set; }
    public int IdLanguage { get; set; }
    //Other properties...
}

返回所有语言的方法:

public List<DTOLanguage> GetLanguages()
{
    var result = repository.RepSite.GetLanguages().Select(x => new DTOLanguage
    {
        IdLanguage = x.IdLanguage,
        CodName = x.CodName,
        Name = x.Name
    }).ToList();

    return result;
}

返回语言子集的方法:

public List<DTOLanguage> GetLanguagesById(int idSite)
{
    var result = repository.RepSite.GetLanguagesById(idSite).Select(x => new DTOLanguage
    {
        IdLanguage = x.IdLanguage
    }).ToList();

    return result;
}

在DataAccess层中调用GetLanguagesById,所以我认为这个方法应该接收另一个参数(GetLanguages返回什么)并在那里做一些花哨的LINQ。

我知道我可以过滤(例子):

SubsetOfLanguages.Where(lg => lg.IdLanguage == AllLanguagesItem.IdLanguage)
    {
        AllLanguagesItem.HaveLanguage = True;
    }

但我不确定它应该如何。

提前致谢。

2 个答案:

答案 0 :(得分:1)

您可以这样使用Contains扩展方法:

var languages=GetLanguages();
var subsetids=repository.RepSite.GetLanguagesById(idSite).Select(x =>x.IdLanguage);//Select just the id value
foreach(var l in languages.Where(l=>subsetids.Contains(l.IdLanguage)))
{
   l.HaveLanguage = true;
}

答案 1 :(得分:0)

你可以这样做:

var allLanguages = GetLanguages();

var subset = SubsetOfLanguages
    .Where(lg => allLanguages.Any(a => lg.IdLanguage == a.IdLanguage))
    .ToArray();

foreach(var item in subset)
{
    item.HaveLanguage = True;
}