2016-12-14 71 views
3

我有两个列表,其中一个是所有语言,另一个是该站点的语言子集,它的想法是返回所有语言,但改变布尔值的属性if子集的元素对应于所有语言的列表。检查哪些元素在一个列表中与另一个列表比较LINQ

DTO语言:

public class DTOLanguage 
{ 

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

方法返回所有语言:

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

    return result; 
} 
:返回语言的子集

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; 
} 

方法

在DataAccess层中调用了GetLanguagesById,所以我认为这种方法应该接收另一个参数(GetLanguages返回)并在那里创建一些奇特的LINQ。

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

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

但是我真的不知道,因为它应该如何。

在此先感谢。

回答

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; 
} 
+0

这真的做到了,upvoted并标记为答案。 作为一个方面说明,我用另一种方法包装它,谢谢! – user3442470

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; 
} 
相关问题