我有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?
答案 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"])));
}