c# - 按属性名称(字符串值)排序列表?

标签 c# linq

<分区>

我有一个对象列表。我如何使用属性名称对该列表进行排序?

string orderbyField = "Code";
List<object> l = FillList();
l = l.OrderBy(o => orderbyField);

我可以扩展这个问题吗?

最佳答案

如果您不必以字符串形式提供属性名称,使用 dynamic 非常简单:

List<object> l = FillList();
l = l.OrderBy(o => ((dynamic)o).Id);

如果属性名称必须是一个字符串,那么它会变得更复杂一点,但可以使用反射来完成(虽然它不是很有效):

l = l.OrderBy(o => o.GetType()
                    .GetProperty("Code")
                    .GetValue(o, null));

您还应该考虑添加一些错误处理,例如如果该属性不存在。

此外,如果列表中的所有元素都具有相同的运行时 类型,那么使用表达式树编译 getter 函数并重用它(而不是直接使用反射)会更有效。

public static Func<object, object> CreateGetter(Type runtimeType, string propertyName)
{
    var propertyInfo = runtimeType.GetProperty(propertyName);

    // create a parameter (object obj)
    var obj = Expression.Parameter(typeof(object), "obj");  

    // cast obj to runtimeType
    var objT = Expression.TypeAs(obj, runtimeType); 

    // property accessor
    var property = Expression.Property(objT, propertyInfo); 

    var convert = Expression.TypeAs(property, typeof(object));
    return (Func<object, object>)Expression.Lambda(convert, obj).Compile();
}

并像这样使用它:

var codeGetter = CreateGetter(l[0].GetType(), "Code"); // using the 1st element as an example
l = l.OrderBy(o => codeGetter(o));

关于c# - 按属性名称(字符串值)排序列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41976476/

相关文章:

c# - 在动态 View 中隐藏模型的属性

c# - 如何在 C# 中获取像 IDM Grabber 这样的特殊网站的文件和文件夹

c# - 下拉列表中的值更改时,在Mainwindow中动态加载用户控件

c# - 识别 Azure ACS 中的角色

c# - 带 OrderBy 字数的 Linq 查询

c# - 使用 linq 将重复项分组并计数到字典中

c# - linq中的左外连接

c# - Umbraco mvc,渲染部分 View 无法解析为类型

MongoDB .NET 驱动程序和文本搜索

c# - 使用 LINQ 从两个不同的列表创建对,其中条目具有相同的属性