按对象属性</object>排序`List <object>`

时间:2012-08-28 10:42:06

标签: c# linq sorting object ienumerable

我有一些不同的对象,它们都有一个名为Place的整数字段。有没有办法在不知道实际对象是什么的情况下整理这个列表?我的意思是只访问Place字段并根据此数字对列表进行排序。可能使用linq或什么?

一些示例对象:

public class Car
{
    public int Place;
    //Other related fields
}

public class Human
{
    public int Place;
    //Other related fields
}

//Somwhere in program
List<object> GameObjects;

7 个答案:

答案 0 :(得分:5)

您应该从基类派生您的类。

public class Base
{
    public int Place;
}

public class Car : Base
{
    // other properties
}

public class Human : Base
{
    // other properties
}

然后,您可以创建基本类型列表,添加人类 和汽车。之后,您可以使用Linq SortOrderBy方法。

List<Base> list = new List<Base>();
list.Add(new Human { Place = 2 });
list.Add(new Car { Place = 1 });

var sortedList = list.Sort(x => x.Place);

更多信息

答案 1 :(得分:4)

不,因为objectPlace / Car没有Human属性。

有几种方法可以解决这个问题:

引入基类

public class GameObject
{
    public int Place { get; set; }
}

public class Car : GameObject
{}

public class Human : GameObject
{}

...
List<GameObject> GameObjects

使用通用界面

public interface IGameObject
{
    int Place { get; }
}

public class Car : IGameObject
{
    public int Place { get; set; }
}

public class Human : IGameObject
{
    public int Place { get; set; }
}

List<IGameObject> GameObjects

答案 2 :(得分:1)

您刚刚发现的是这些类型之间的关系。 CarHuman似乎都有一个Place属性,因此您应该提取一个la IGameObject接口。

答案 3 :(得分:1)

最好的方法是使用界面。如果不能,您仍然可以使用dynamic关键字进行后期绑定:

        var list = new List<object>
        {
            new Car { Place = 3 },
            new Human { Place = 1 },
            new Car { Place = 2 }
        };

        var sortedList = list.OrderBy(o => ((dynamic)o).Place);

答案 4 :(得分:0)

是的,可以使用带反射的委托方法。据我所知,可能是其他一些巨头在没有使用反射的情况下创建它

答案 5 :(得分:0)

您可以让他们实现接口IPlaceable并使用属性而不是仅使用字段:

public interface IPlaceable
{
    int Place { get; set; }
}

public class Car : IPlaceable
{
    public int Place { get; set; }
    //Other related fields
}

public class Human : IPlaceable
{
    public int Place { get; set; }
    //Other related fields
}


// Somwhere in program
List<IPlaceable> GameObjects;

// Somwhere else
GameObjects.OrderBy(go => go.Place);

请注意,该列表现在是List<IPlaceable>而不是List<Object>

答案 6 :(得分:0)

你能做的最好的就是使用一个接口,如下所示:

public Interface IFoo
{
  int place;
}

接口的工具:

public class Car : IFoo
{
    public int Place;
}

public class Human : IFoo
{
    public int Place;
}

然后用linq:

List<IFoo> GameObjects;

GameObjects.OrderBy(g => g.Place);