简体   繁体   中英

Check which elements are on one list comparing to another list LINQ

I have two lists, one of all languages and another subset of languages that the site has, the idea is to return all the languages but change the property of a boolean if the element of the subset corresponds to the list of all languages.

DTO of language:

public class DTOLanguage
{

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

Method that returns all languages:

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

Method that returns the subset of languages:

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

    return result;
}

The GetLanguagesById is called in the DataAccess layer, so what Im thinking is that this method should receive another parameter (what GetLanguages returns) and make some fancy LINQ there.

I know that I can filter (example):

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

But Im not really sure as how it should be.

Thanks in advance.

You could use Contains extension method this way:

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

You could do this:

var allLanguages = GetLanguages();

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM