Как получить элементы из List <>, используя Linq и Dictionary в запросе C #? - PullRequest
0 голосов
/ 21 октября 2018

Существует модель:

public class Word
{
    public Dictionary<string, string> Langs { get; set; }
}

Существует список языков для использования:

    // I need to use these 2 langs only
    List<string> langsToUse = new List<string> { "en", "pl" };

Список слов содержит ненужные или недопустимые langs:

List<Word> wordsList = new List<Word> {
new Word {
    Langs = new Dictionary<string, string> {
        {"en", "Dog"},
        {"pl", "Pies"},
        {"ge", "Hund"},
        //... and so on
    }},
new Word {
    Langs = new Dictionary<string, string> {
        {"en", "Kat"},
        {"pl", ""},
        {"ge", ""}
        //... and so on
    }},
new Word {
    Langs = new Dictionary<string, string> {
        {"en", "Car"},
        {"pl", ""},
        {"ge", ""}
        //... and so on
    }},
};

Простой способ проверить это так:

// And value shouldn't be ""
var validWords = wordsList.Where(p => p.Langs["en"] != "" &&
                                      p.Langs["pl"] != "");

Я не хочу каждый раз набирать клавиши "en", "pl" вручную, поэтому мне нужно как-то его автоматизировать,как-то так:

// use foreach for validate words
List<Word> validWords_2 = new List<Word>();

foreach(Word word in wordsList)
{
    bool isWordValid = true;

    foreach(string lang in langsToUse)
    {
        if(word.Langs[lang] == ""){
            isWordValid = false;
        }
    }

    if(isWordValid) {
        validWords_2.Add(word);
    }
}

Но я думаю, что эту автоматизацию можно сделать проще, если есть какой-то способ сделать это с помощью Linq и Dictionary каким-то образом.

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Вы можете упростить свой код проверки, используя LINQ, например:

var validWords = wordsList
    .Where(word => langsToUse.All(lang => word.Langs[lang] != ""))
    .ToList();

Fiddle: https://dotnetfiddle.net/qqLxzd

Выше предполагается, что все словари Langs будут содержать ключ для каждогоязык в langsToUse.Если это не так, вы должны использовать TryGetValue:

var validWords = wordsList
    .Where(word => langsToUse.All(
                   lang => word.Langs.TryGetValue(lang, out string w) && w != ""))
    .ToList();
0 голосов
/ 21 октября 2018

Если я правильно понимаю, вы можете попробовать использовать linq join

List<string> keyList = new List<string> { "key_01", "key_02" };
var dictionary_name = new Dictionary<string, string>()
            {
                {"key_01", "val_01"},
                {"key_02", "val_02"}
            };
var results = from i in keyList
            join k in dictionary_name on i equals k.Key
            select i;

Или использовать только метод Contains.

dictionary_name.Where(x => keyList.Contains(x.Key));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...