【问题标题】:C# Sort list by IDs, but without creating a new listC# 按 ID 对列表进行排序,但不创建新列表
【发布时间】:2018-06-25 12:26:50
【问题描述】:

我有 2 个列表,一个是原始列表,另一个是排序列表。 我想按第二个列表对第一个列表进行排序,但我的方法不会返回任何内容,因此它必须对列表进行适当的排序。

我做了这个方法:

public void SortByList(IEnumerable<JObject> source, IEnumerable<JObject> products)
{
    var ids = source.Select(m => m["_id"].ToString()).ToList();
    products.OrderBy(m => ids.IndexOf(m["_id"].ToString()));
}

但如您所知,OrderBy 会创建一个新列表。我如何Sort 使用 ID?

【问题讨论】:

  • 您可以使用Comparison&lt;T&gt; 代表就地排序:stackoverflow.com/a/3309292/860585
  • IComparer&lt;T&gt;。但是,当您的参数为 IEnumerable&lt;JObject&gt; 时,这将不起作用 - 您可以将其更改为 List&lt;JObject&gt; 吗?
  • 使用 yield 语法 public IEnumerable&lt;JObject&gt; ... 并在方法内部编写实际代码。但不是返回列表,而是使用 yield return 返回单个条目。 C# 将尽一切努力使其成为IEnumerable&lt;&gt; 以进一步增强,然后您可以通过将方法设为静态并在源代码前添加this 来使该方法成为静态扩展
  • 如果您需要保持IEnumerable 的身份,@X39 建议的方法是唯一的选择。否则,为了对其进行排序,您必须将其转换为具体类型,例如List&lt;JObject&gt;.
  • 你说的那些名单在哪里?

标签: c#


【解决方案1】:

嗯,没有列表,所以我假设您实际上传递了列表。如果您不想创建新列表,则必须将其强制转换为列表或将参数类型更改为List&lt;T&gt;。然后就可以使用List.Sort

public void SortByList(List<JObject> sourceList, IEnumerable<JObject> products)
{
    List<JObject> productList = products as List<JObject> ?? products.ToList();
    sourceList.Sort((x1, x2) => productList
        .FindIndex(p => p["_id"] == x1["_id"])
        .CompareTo(productList.FindIndex(p => p["_id"] == x2["_id"])));
}

【讨论】:

    【解决方案2】:

    使用 yield 语法:

    //Returns source sorted by products
    //Due to usage of the `this` keyword on the `IEnumerable<JObject> source` parameter,
    //this method can be called like a member method on any instance imlpementing `IEnumerable<JObject>`.
    public static class MyProductExtensionMethods {
        public static IEnumerable<JObject> SortByList(this IEnumerable<JObject> source,
                    IEnumerable<JObject> products) {
            foreach(var prod in products) {
                // sorting happens here and assigning the next sorted item
                // to the variable  `sorted_next` (sorting part obviously not provided)
                yield return sorted_next;
            }
        }
    }
    

    关于该主题的更多信息:

    【讨论】:

    • 这不只是返回一个列表吗?我需要它是无效的。它必须就地排序
    • sort in place 根本无法与IEnumerable&lt;&gt; 一起使用(请参阅 IEnumerator 接口了解更多关于为什么不使用的信息,简短版本:它不应该支持类似的东西)。如果您需要它就地排序,则需要传递一个有效的、可排序的列表或数组。此方法会根据您输入的内容为您提供一个单独的IEnumerable&lt;&gt;
    • 如果你再次想提供一个List&lt;&gt; 实现,你可能在这里得到了stackoverflow.com/questions/3309188/… 的副本,正如 CodeNotFound 所说的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    • 2010-11-18
    • 2021-02-07
    • 1970-01-01
    • 2015-03-05
    相关资源
    最近更新 更多