在一个列表中声明两个对象

本文关键字:两个 对象 声明 一个 列表 | 更新日期: 2023-09-27 18:06:26

我所做的工作很好。我很好奇是否有更好的方法通过Linq来实现这一点。目前我声明了一个数组列表,填充它,然后再运行它。我可以运行一条linq语句来拉出Windows程序,然后将Linux程序添加到列表中吗?

foreach (var winProgram in allWinPrograms.Descendants("Programs").Select(p => new
{
    progName = p.Element("ProgramName").Value
}))
{
    alTemp.Add(winProgram.progName.ToString());
}
foreach (var linProgram in allLinPrograms.Descendants("Programs").Select(p => new
{
    progName = p.Element("ProgramName").Value
}))
{
    alTemp.Add(linProgram.progName.ToString());
}
foreach (string newProgram in alTemp)
{
    if (!alPrograms.Contains(newProgram))
    {
        alPrograms.Add(newProgram);
    }
}

在一个列表中声明两个对象

假设allWinProgramsallLinPrograms的后代是相同的类型,您应该能够像这样使用LINQ的Concat:

var sorted = allWinPrograms.Descendants("Programs")
    .Concat(allLinPrograms.Descendants("Programs"))
    .Select(p => p.Element("ProgramName").Value.ToString())
    .Distinct();

短解

foreach (var prg in allWinPrograms.Union(allLinPrograms).Select(x => x).Where(prg =>!allPrograms.Contains(prg)))
{
    allPrograms.Add(prg);
}

长期解决方案

foreach (var prg in allWinPrograms.Union(allLinPrograms).Select(x => x))
{
     if (!allPrograms.Contains(prg))
     {
         allPrograms.Add(prg);
     }
 }

如果你把所有东西都放在同一行,那么它的可读性如何?你可能会从linq执行中获得一些性能上的好处,但是也要记住代码要干净。

        foreach (var winProgram in allWinPrograms.Descendants("Programs").Select(p => new
        {
            progName = p.Element("ProgramName").Value
        }))
        {
            alTemp.Add(winProgram.progName);
        }
        foreach (var linProgram in allLinPrograms.Descendants("Programs").Select(p => new
        {
            progName = p.Element("ProgramName").Value
        }))
        {
            alTemp.Add(linProgram.progName);
        }
        foreach (string newProgram in alTemp.Cast<string>().Where(newProgram => !alPrograms.Contains(newProgram)))
        {
            alPrograms.Add(newProgram);
        }