使用LINQ从2个不同的列表中查找和打印值

时间:2017-12-27 01:46:54

标签: c# linq

我无法理解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语句,我不知道如何用一个语句获得多个值。

2 个答案:

答案 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,你可以忽略这种差异。