C# 使用列表列表筛选列表的Linq查询

C# 使用列表列表筛选列表的Linq查询,c#,linq,linq-to-objects,C#,Linq,Linq To Objects,我仍在学习LINQ,并尝试使用一个列表中的对象作为标识符来查找另一个列表中的对象 我有两个对象列表,类似于下面的模拟代码。使用LINQ,我想使用变量selectedCountry列出特定国家国旗颜色的所有颜色.Hex 因此,如果选择了Country=“USA”,我希望能够进行控制台操作。编写: USA RED FF0000 Blue 0000FF White FFFFFF 为了可读性,最好使用查询语法 public class Countries { public string

我仍在学习LINQ,并尝试使用一个列表中的对象作为标识符来查找另一个列表中的对象

我有两个对象列表,类似于下面的模拟代码。使用LINQ,我想使用变量selectedCountry列出特定国家国旗颜色的所有颜色.Hex

因此,如果选择了Country=“USA”,我希望能够进行控制台操作。编写:

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
    }
}
公共类国家
{
公共字符串名称;
公共列表FlagColor=新列表();
}
公共类颜色
{
公共字符串名称;
公共字符串十六进制;
}
公共部分类Form1:Form
{
公共静态列表国家/地区=新列表();
公共静态列表颜色=新列表();
公共图书馆
{
添加(新颜色{Name=“Red”,Hex=“FF0000”});
添加(新颜色{Name=“Blue”,Hex=“0000FF”});
添加(新颜色{Name=“White”,Hex=“FFFFFF”});
添加(新颜色{Name=“Yellow”,Hex=“FFFF00”});
Countries newCountry=新国家();
newCountry.Name=“美国”;
newCountry.FlagColors.Add(“红色”);
newCountry.FlagColors.Add(“白色”);
newCountry.FlagColors.Add(“蓝色”);
country.Add(newCountry);
Countries newCountry2=新国家();
newCountry2.Name=“瑞典”;
newCountry2.FlagColor.添加(“蓝色”);
newCountry2.FlagColor.添加(“黄色”);
country.Add(newCountry2);
字符串selectedCountry=“USA”;
//这里是Linq查询
}
}

提前感谢

您可以这样做:

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查询非常简单,您基本上希望返回与条件谓词匹配的第一个元素(在本例中,
名称
等于
selectedCountry
flagColor

,您可以这样做:

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查询非常简单,您基本上希望返回与条件谓词匹配的第一个元素(在本例中,
名称
等于
selectedCountry
flagColor

类似的内容,可能是:

    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;

也许是这样的:

    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;

谢谢。让代码正常工作,它做了我想要的。是的,它看起来很简单,只是需要学习语法。这一过程很有帮助。干杯!谢谢。让代码正常工作,它做了我想要的。是的,它看起来很简单,只是需要学习语法。这一过程很有帮助。干杯!