我有一些不同的对象,它们都有一个名为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;
答案 0 :(得分:5)
您应该从基类派生您的类。
public class Base
{
public int Place;
}
public class Car : Base
{
// other properties
}
public class Human : Base
{
// other properties
}
然后,您可以创建基本类型列表,添加人类
和汽车。之后,您可以使用Linq Sort
或OrderBy
方法。
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)
不,因为object
仅Place
/ 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)
您刚刚发现的是这些类型之间的关系。 Car
和Human
似乎都有一个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);