我无法理解LINQ语句。我必须遵循以下代码:
//All list are filled from a file//
if (DoctorList.Any(y => EpisodeList.Any(x => y.Debut == x.Story)))
{
Year.Text = x.Year.ToString();
Episode.Text = x.Title;
}
if (DoctorList.Any(y => CompanionList.Any(c => y.docNum == c.Doctor)))
{
Companions.Items.Add(String.Format(c.Name + " (" + c.Actor + ")"));
}
if (CompanionList.Any(y => EpisodeList.Any(x => x.Story == y.Debut)))
{
Companions.Items.Add(String.Format(x.Title + " (" + x.Year + ")"));
Companions.Items.Add("");
}
我有2个问题。 1 - 我需要打印找到的对象的值。例如,在下面的代码中,我需要获取一个存储在对象x中的值,名为Year,值为Title。
if (DoctorList.Any(y => EpisodeList.Any( x => y.Debut == x.Story)))
{
Year.Text = x.Year.ToString();
Episode.Text = x.Title;
}
2 - 使用第二个和第三个if语句。可能有30个不同的伴侣应该添加到listBox但是使用那些if语句,我只会找到一个。我还在学习如何使用LINQ语句,我不知道如何用一个语句获得多个值。
答案 0 :(得分:2)
很难理解你正在做什么或想要实现什么
但你需要改变你的逻辑我认为你可以访问这一集
关于你的第一个问题,如果你只是想访问第一集,发现你可以做这样的事情
var episode = EpisodeList.FirstOrDefault(x => DoctorList.Any(y => y.Debut == x.Story));
if (episode != null)
{
Debug.WriteLine($"year = {episode.Year}, Title = {episode.Title}");
}
关于你的第二个问题,如果你有多次出现,你可以只做一个地方,并选择一个列表,动态地进行格式化并添加它做伴随列表(可能是什么)
var namesActors = EpisodeList.Where(x => DoctorList.Any(y => y.docNum == x.Doctor))
.Select(x => $"{x.Name} ({x.Actor})")
.ToList();
foreach (var value in namesActors)
Companions.Items.Add(value);
var titleYears = EpisodeList.Where(x => DoctorList.Any(y => y.Debut == x.Story))
.Select(x => $"{x.Title} ({x.Year})")
.ToList();
foreach (var value in titleYears)
Companions.Items.Add(value);
答案 1 :(得分:1)
我首先使用LINQ过滤相关对象。
如果您知道最多有一个匹配的对象,那么您可以使用SingleOrDefault返回找到的对象,或者对象的默认值为null:
Episode e = EpisodeList.SingleOrDefault(x => DoctorList.Any(y => y.Debut == x.Story))
if (e != null) // found episode
{
Year.Text = e.Year.ToString();
Episode.Text = e.Title;
}
如果可以有多个结果,您可以使用Where:
List<Episode> es = EpisodeList.Where(x => DoctorList.Any(y => y.Debut == x.Story)).ToList();
foreach (Episode e in es)
{
Companions.Items.Add(String.Format(e.Title + " (" + e.Year + ")"));
Companions.Items.Add("");
}
您还可以使用以下语法,这种语法更容易编写(虽然可读性稍差)
var es = EpisodeList.Where(x => DoctorList.Any(y => y.Debut == x.Story));
foreach (var e in es)
{
Companions.Items.Add(String.Format(e.Title + " (" + e.Year + ")"));
Companions.Items.Add("");
}
额外信息 在LINQ to SQL中,将使用惰性求值,因此“ToList()”会强制它立即从数据库中获取结果。这不是等待使用结果(在这种情况下通过使用foreach循环迭代它)。但是如果你没有使用LINQ to SQL,你可以忽略这种差异。