【问题标题】:Pass a C# class property as argument in a method将 C# 类属性作为参数传递给方法
【发布时间】:2021-02-05 10:14:18
【问题描述】:

我有一个 void SortTable,我可以根据属性(在本例中为 ticketId)对类实例数组进行排序。

private void SortTable()
    {
        if (ascending)
        {
            Array.Sort(tickets,
            delegate (TicketData x, TicketData y) { return x.ticketId.CompareTo(y.ticketId); });
        } else
        {
            Array.Sort(tickets,
            delegate (TicketData x, TicketData y) { return y.ticketId.CompareTo(x.ticketId); });
        }
        ascending = !ascending;
    }

它有效,但我有一个包含更多字段的表,我想按这些字段进行排序。我可以通过为表中的每个字段创建空白来解决这个问题。它就像 SortByTicketId()、SortByName() 等。但我想要一个函数来处理这个。

我想写这样的东西:

private void SortTable(sortByThisProperty)
    {
        Array.Sort(tickets,
        delegate (TicketData x, TicketData y) { return x.[sortByThisProperty].CompareTo(y.[sortByThisProperty]); });
    }

但是这个伪代码不起作用,我看不出有办法将属性作为参数传递。 一定有其他方法可以做到这一点?

【问题讨论】:

  • 看看动态linq
  • 使用 LINQ 是最好的选择。您是否可以控制要排序的属性,还是允许用户选择要排序的内容?

标签: c# arrays class sorting blazor


【解决方案1】:

为什么不使用 linq 的 OrderBy?

var employees = ....
employees.OrderBy(e => e.Name).ToArray();

但一种方法是使用像 linq 这样的选择器:

private void SortTable<T, Q>(T[] source, Func<T, Q> sortSelector)
    where Q: IComparable<Q>
{
    Array.Sort(source, (x, y) => sortSelector(x).CompareTo(sortSelector(y)));
});

你会以类似的方式使用它:employees.SortTable(e =&gt; e.Name);

【讨论】:

  • 非常感谢。我正在尝试 OrderBy solotion,因为它非常简单。但我找不到调用函数并将某些内容传递给 OrderBy 的方法。这可能是因为我使用的是 Blazor,而且情况有些不同。 ID private void SortTable() { ticket = ticket.OrderByDescending(e => e.ticketId).ToArray();我正在尝试在 OrderBy 中传递“e => e.ticketId”。
  • @tonyarntsen 确保你有 using System.Linq 指令。我不知道 Blazor,说实话......
  • 嗯,它工作得很好,考虑到 Blazor 只是有点不同,但我会弄清楚这一点。再次感谢
【解决方案2】:

我从 Blazor onclick 事件中找到了一种方法。

private void SortBy(string columnName)
{
    tickets = tickets.OrderBy(x => x.GetType().GetProperty(columnName).GetValue(x, null)).ToArray();
}

这样类属性可以作为字符串传递。

在 HTML 元素中添加:

<th @onclick="@(() => SortBy("ticketId"))">ID</th> 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-30
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    相关资源
    最近更新 更多