我还在学习LINQ,我正在尝试使用一个列表中的对象作为标识符来查找另一个列表中的对象。
我有两个对象列表,类似于下面的模拟代码。使用LINQ,我想使用变量selectedCountry列出特定Country的标志颜色的所有Colors.Hex。
所以如果selectedCountry =“USA”,我希望能够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
}
}
提前致谢
答案 0 :(得分: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
。
答案 1 :(得分: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;