C#按ID对列表进行排序,但不创建新列表

时间:2018-06-25 12:26:50

标签: c#

我有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?

2 个答案:

答案 0 :(得分:1)

使用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;
        }
    }
}

有关该主题的更多信息:

答案 1 :(得分:1)

好吧,没有列表,所以我认为您实际上是通过列表的。如果您不想创建新列表,则必须将其强制转换为列表或将参数类型更改为List<T>。然后,您可以使用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"])));
}