2017-02-11 6 views
0

Я все еще изучаю LINQ, и я пытаюсь использовать объект из одного списка в качестве идентификатора для поиска объектов в другом списке.Запрос Linq для использования списка списков для фильтрации списка

У меня есть два списка объектов, похожие на мой макет кода ниже. Используя LINQ, я хочу перечислить все цвета Colors.Hex определенного цвета флага страны, используя переменную selectedCountry.

Так что если SELECTEDCOUNTRY = "США", я хотел бы быть в состоянии Console.Write:

USA 
RED FF0000 
Blue 0000FF 
White FFFFFF 

Предпочтительно в синтаксисе запроса, для удобства чтения.

public class Countries 
{ 
    public string Name; 
    public List<string> FlagColors = new List<string>(); 
} 

public class Colors 
{ 
    public string Name; 
    public string Hex; 
} 

public partial class Form1 : Form 
{ 
    public static List<Countries> country = new List<Countries>(); 
    public static List<Colors> color = new List<Colors>(); 

    public void foo() 
    { 
     color.Add(new Colors { Name= "Red", Hex = "FF0000"}); 
     color.Add(new Colors { Name= "Blue", Hex = "0000FF" }); 
     color.Add(new Colors { Name= "White", Hex = "FFFFFF" }); 
     color.Add(new Colors { Name= "Yellow", Hex = "FFFF00" }); 

     Countries newCountry = new Countries(); 
     newCountry.Name = "USA"; 
     newCountry.FlagColors.Add("Red"); 
     newCountry.FlagColors.Add("White"); 
     newCountry.FlagColors.Add("Blue"); 
     country.Add(newCountry); 

     Countries newCountry2 = new Countries(); 
     newCountry2.Name = "Sweden"; 
     newCountry2.FlagColors.Add("Blue"); 
     newCountry2.FlagColors.Add("Yellow"); 
     country.Add(newCountry2); 

     string selectedCountry = "USA"; 

     // Linq query here 
    } 
} 

Заранее спасибо

ответ

2

Вы можете сделать это следующим образом:

Country selectedCountry = country.SingleOrDefault(x => x.Name == selectedCountry); 
if (selectedCountry != null) { 
    Console.WriteLine(selectedCountry.Name); 
    foreach (string flagColor in selectedCountry.FlagColors) { 
     Colors color = color.SingleOrDefault(x => x.Name == flagColor); 
     if (color != null) { 
      Console.WriteLine(color.Name + " " + color.Hex); 
     } 
    } 
} 

Как вы можете видеть запросы Linq довольно просты, вы в основном хотят вернуть первый элемент, который соответствует (в этом случае, когда Name равен selectedCountry или flagColor.

+0

Спасибо. Получил код, и он делает то, что я хочу. Да, это кажется достаточно простым, просто нужно изучить синтаксис. Это помогает на этом пути. Ура! – Caliber

1

Что-то вроде это, возможно:

var q = from c1 in country 
     from c2 in c1.FlagColors 
     from c3 in color 
     where c3.Name == c2 && c1.Name == selectedCountry 
     select c3.Hex; 

Или же:

var q = from c1 in country 
     from c2 in c1.FlagColors 
     join c3 in color on c2 equals c3.Name 
     where c1.Name == selectedCountry 
     select c3.Hex; 
Смежные вопросы