C# LINQ 返回泛型 List<T>

3

下面是我抽样的两个类。 不使用元组; 我想直接从第一个列表向第二个结果列表发送查询。

在编码时失败的部分显示为转换操作。

感谢您的时间和回复。

        static void Main(string[] args)
    {

        List<liste> personel = new List<liste>{

            new liste { PersonId = 1, Name = "Burak", Surname = "Şenyurt", City = "İstanbul", Salary = 890 },
            new liste { PersonId = 2, Name = "Maykıl", Surname = "Cordın", City = "Chicago", Salary = 930 },
            new liste { PersonId = 3, Name = "Şakiyıl", Surname = "Oniyıl", City = "Los Angles", Salary = 986 },
            new liste { PersonId = 4, Name = "Ümit", Surname = "Oniyıl", City = "Los Angles", Salary = 1035 },
            new liste { PersonId = 5, Name = "Mehmet", Surname = "Zaferoğlu", City = "Los Angles", Salary = 1265 },
            new liste { PersonId = 6, Name = "Hasan", Surname = "Orkun", City = "Los Angles", Salary = 1435 },
            new liste { PersonId = 7, Name = "Raşit", Surname = "Mesut", City = "Los Angles", Salary = 1469 },
            new liste { PersonId = 8, Name = "Hamdi", Surname = "Tanpınar", City = "Los Angles", Salary = 1535 },
            new liste { PersonId = 9, Name = "Şevki", Surname = "Çapkın", City = "Los Angles", Salary = 1636 },
            new liste { PersonId = 10, Name = "Özhun", Surname = "Bozkurt", City = "Los Angles", Salary = 1839 }
        };
        double resAVG = personel.Select(x => x.Salary).Average();
        List<Sonuc> reportResult = GetReport(personel,resAVG);
    }

静态方法

        public static List<Sonuc> GetReport(List<liste> listePersonel , double resAVG)
    {
        List<Sonuc> result = (from e in listePersonel
                      where e.Salary >= resAVG
                      orderby e.Salary descending
                    //select new Tuple<string, string, double>(e.Name, e.Surname, e.Salary)).ToList<Tuple<string, string, double>>();
        select new List<Sonuc>(e.Name, e.Surname, e.Salary)).ToList<Sonuc>(result.ToList());

        return result;
    }

普通类

   public class liste
{
    public int          PersonId        { get; set; }
    public string       Name            { get; set; }
    public string       Surname         { get; set; }
    public string       City            { get; set; }
    public double       Salary          { get; set; }

    public override string ToString()
    {
        return $"PersonId : {PersonId}\t\tName , Surname {Name} , {Surname}\t\t\tSalary : {Salary}";
    }
}

结果类

    public class Sonuc
{
    public string       Name            { get; set; }
    public string       Surname         { get; set; }
    public double       Salary          { get; set; }

    public Sonuc(string Name , string Surname, double Salary)
    {
        this.Name = Name;
        this.Surname = Surname;
        this.Salary = Salary;
    }

    public override string ToString()
    {
        return $"Name, SurName : {this.Name} ,   {this.Surname}\t\t\tSalary : {this.Salary}";
    }
}

有错误吗?“在编码中失败的部分似乎表现为转换操作。” - 是什么失败了?(当前结果,期望结果) - Julian
1
GetReport 期望第一个参数的类型为 Sonuc,但您正在传递类型为 liste。这甚至能编译吗? - Bret Lipscomb
@BretLipscomb 谢谢,我没有看到那个错误。 现在我已经整理好了。 但是我仍然遇到编译错误'Error CS1729 'List<Sonuc>' 不包含一个接受3个参数的构造函数''Error CS0165 使用未分配的本地变量'result''Message IDE1006 命名规则违规:这些单词必须以大写字母开头:liste - Umit Terzi
“GetReport” 应该以 “List<liste>” 的实例作为其第一个参数,还是以 “List<Sonuc>” 的实例作为其第一个参数? - Joshua Robinson
@Julian,我在先前的评论中写了错误代码。============== “错误 CS1729 'List <Sonuc> '不包含一个带3个参数的构造函数”“错误CS0165使用未分配的本地变量'result'”“消息IDE1006命名规则违规:这些单词必须以大写字符开头:liste” - Umit Terzi
@JoshuaRobinson 公共静态列表<Sonuc> GetReport(List<Sonuc> listePersonel, double resAVG) 我打错了,列表需要是<liste>。请您这样考虑。 - Umit Terzi
1个回答

3

你正在尝试通过传递一个string、一个string和一个double来构造一个List<T>的实例。List<T>没有接受这些参数的构造函数。此外,在赋值之前不能使用result

相反,你应该将listePersonel中的每个项投影到单个Sounc实例,然后将可枚举对象转换为List<Sounc>

public static List<Sonuc> GetReport(List<liste> listePersonel , double resAVG)
{
    List<Sonuc> result = (from e in listePersonel
                  where e.Salary >= resAVG
                  orderby e.Salary descending
                  select new Sonuc(e.Name, e.Surname, e.Salary)).ToList();

    return result;
}

感谢您编写出优秀的解决方案。对于不同的解决方案或性能,您有什么建议?我是一名初学者,通过阅读书籍和观看视频来学习软件开发。但也存在一般性的叙述。敬礼 - Umit Terzi
嗯,在不同的解决方案方面...这可能是我编写类似函数的方式。我认为它应该表现得足够好,任何优化都会过早。:) - Joshua Robinson
谢谢你的回答。 我想按以下方式更新我的状态。 一个拥有10亿行的表格中有30列 71136 x 5 x 2 = 我需要创建连续报告,使用711,360个查询。我很好奇你的性能。 你会怎么做? - Umit Terzi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接