【问题标题】:C# Linq query in a Class doesn't work类中的 C# Linq 查询不起作用
【发布时间】:2016-09-27 20:09:42
【问题描述】:

我正在处理一个学校项目,但我遇到了一个问题。

我想按照口袋妖怪的速度对我的列表进行排序。我可以在我的主程序(控制台)中对其进行排序

class Program
{
    public static void Main()
    {
        TabPokemon tab = new TabPokemon();
        PokemonSportif poke = new PokemonSportif("Pikachu", 110, 22, 1, 56);
        tab.Add(poke);
        PokemonSportif poke1 = new PokemonSportif("Salameche", 15, 2, 3, 56);
        tab.Add(poke1);
        PokemonSportif poke2 = new PokemonSportif("Bulbizar", 5, 8, 2, 56);
        tab.Add(poke2);
        PokemonSportif poke3 = new PokemonSportif("Mew", 10, 30, 1, 56);
        tab.Add(poke3);

        var sorted = from p in tab orderby p.vitesse() ascending select p;

        foreach(Pokemon p in sorted)
        {
            write(p.ToString() + " -- Vitesse: " + p.vitesse());
            sauterLigne();
        } 
        Console.Read();
    }
    static public void write(string chaine)
    {
        Console.WriteLine(chaine);
    }
    static public void sauterLigne()
    {
        Console.WriteLine(Environment.NewLine);
    }
}

但我想在管理我的列表的班级中使用我的 Linq 查询。

当我调用我的函数时,它不起作用

我的班级:

class TabPokemon : List<Pokemon>
{
    List<Pokemon> PokeList;

    public TabPokemon()
    {
        PokeList = new List<Pokemon>();
    }

    public void orderBySpeedAscending()
    {
        var sorted = from p in PokeList orderby p.vitesse() ascending select p;
    }

}

当我想用这条指令在我的程序中调用它时:

tab.orderBySpeedAscending();

我的数组没有排序。

我不知道你是否明白,但我想使用 void 方法和 linq 查询。

提前感谢您的回复。

class PokemonSportif : Pokemon
{
    int nbPattes;
    double taille, frqCardiaque;

    public int NbPattes
    {
        get
        {
            return nbPattes;
        }

        set
        {
            nbPattes = value;
        }
    }  

    public double Taille
    {
        get
        {
            return taille;
        }

        set
        {
            taille = value;
        }
    }

    public double FrqCardiaque
    {
        get
        {
            return frqCardiaque;
        }

        set
        {
            frqCardiaque = value;
        }
    }

    public PokemonSportif(string unNom, double unPoid, int unNbPattes, double uneTaille, double uneFrqCardiaque) : base(unNom, unPoid)
    {
        NbPattes = unNbPattes;
        Taille = uneTaille;
        FrqCardiaque = uneFrqCardiaque;
    }
    public override double vitesse()
    {
        return NbPattes * Taille * 3;
    }

    public override string ToString()
    {
        return base.ToString() + " || Nombre de pattes: " + NbPattes + " || Taille: "+Taille + " || Frequence cardiaque: "+FrqCardiaque ;
    }
}

【问题讨论】:

  • 您正在为var sorted = ... 列出的排序声明一个变量,但您的返回类型是void。您实际上需要return 排序列表,而不仅仅是将其分配给变量。
  • PokeList = (from p in PokeList orderby p.vitesse() ascending select p).ToList();
  • 您能否发布 PokemonSportif 类的构造函数,因为很难看到您传入的内容,实际上是这样吗?乍一看,您的 orderBySpeedAscending() 方法只是创建了一个 sorted IEnumerable 而没有做任何其他事情。您能否更具体地说明您的代码的哪一部分不起作用?您有 2 个 OrderBy 查询 - 哪一个有问题?
  • 完成代码正在运行,只是我想在我的类中创建方法(使用 linq 查询)来管理我的列表

标签: c# linq list sorting methods


【解决方案1】:

大多数 linq 查询不会修改原始列表,而是在查询运行时返回一个新集合。

public void orderBySpeedAscending()
{
    this.PokeList = (from p in PokeList orderby p.vitesse() ascending select p).ToList();
}

执行上述操作会产生替换PokeList变量中引用列表的效果。

【讨论】:

  • 我试过了,不行 列表和原来的一样:/
  • 我看到你继承了 List 到 TabPokemon。如果您在 TabPokemon 上调用 Add 方法,那么 pokemon 永远不会进入您的 PokeList 变量。因此,排序 PokeList 永远不会做任何事情,因为它一开始就没有任何项目。如果您想在保持 void 排序方法的同时对列表进行排序,我建议您使用 Sort 方法并编写一个 Comparer 类而不是使用 linq。无论如何,这可能是你的老师希望你做的。
【解决方案2】:

在您的函数 orderBySpeedAscending 中,您将排序结果分配给名为 sorted 的局部变量,然后在您退出函数时将其丢弃。

您需要将排序后的结果保存到类成员中,以在函数退出后保留其值。

【讨论】:

  • 我在哪里可以保存它?
  • 这取决于你想要做什么。最简单的事情是将结果放回您现有的 PokeList 成员中。请参阅 Igor 对您原始问题的评论。 ToList() 是必需的,因此您的结果将是一个列表,因此与 PokeList 成员的数据类型相同。
  • 另外,你有两个列表:一个在 PokeList 成员中,一个继承自基类 List。您正在将您的口袋妖怪添加到基类的列表中,然后对您的类成员 PokeList 引用的另一个列表进行排序。您需要决定是尝试将列表封装为类成员还是从它继承为基类。
【解决方案3】:
    public void orderBySpeedAscending()
{
    var sorted = from p in PokeList orderby p.vitesse() ascending select p;
    this.PokeList = sorted.ToList();
}

这应该将列表设置为您已排序的 var。

【讨论】:

  • 我收到此消息错误:无法将类型“System.Linq.IOrderedEnumerable”隐式转换为“System.Collections.Generic.List”。存在显式转换(您是否缺少演员表?)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-06
  • 2018-07-07
  • 1970-01-01
相关资源
最近更新 更多