Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在列表中对列表进行排序_C#_Sorting - Fatal编程技术网

C# 在列表中对列表进行排序

C# 在列表中对列表进行排序,c#,sorting,C#,Sorting,我有一份产品清单: public IList<JObject> WhenListProducts() { return new List<JObject> { JObject.Parse("{ \"gtin\": 1, \"categoryId\": \"cameras\", \"brand\": \"Sony\", \"colour\": \"Blacks\", \"size\": \"Small\", \"quality\": \"Me

我有一份产品清单:

public IList<JObject> WhenListProducts()
{
    return new List<JObject>
    {
        JObject.Parse("{ \"gtin\": 1, \"categoryId\": \"cameras\", \"brand\": \"Sony\", \"colour\": \"Blacks\", \"size\": \"Small\", \"quality\": \"Medium\", \"price\": 109.99, \"importance\": 50 }"),
        JObject.Parse("{ \"gtin\": 2, \"categoryId\": \"cameras\", \"brand\": \"Canon\", \"colour\": \"Blacks\", \"size\": \"Large\", \"quality\": \"High\", \"price\": 129.99, \"importance\": 125 }"),
        JObject.Parse("{ \"gtin\": 3, \"categoryId\": \"cameras\", \"brand\": \"Canon\", \"colour\": \"Blacks\", \"size\": \"Small\", \"quality\": \"Medium\", \"price\": 99.99, \"importance\": 75 }"),
        JObject.Parse("{ \"gtin\": 4, \"categoryId\": \"cameras\", \"brand\": \"Nikon\", \"colour\": \"Silvers\", \"size\": \"Large\", \"quality\": \"High\", \"price\": 159.99, \"importance\": 113 }"),
        JObject.Parse("{ \"gtin\": 5, \"categoryId\": \"cameras\", \"brand\": \"Sony\", \"colour\": \"Silvers\", \"size\": \"Small\", \"quality\": \"High\", \"price\": 179.99, \"importance\": 150 }"),
        JObject.Parse("{ \"gtin\": 6, \"categoryId\": \"cameras\", \"brand\": \"Canon\", \"colour\": \"Silvers\", \"size\": \"Large\", \"quality\": \"Low\", \"price\": 116.99, \"importance\": 25 }"),
        JObject.Parse("{ \"gtin\": 7, \"categoryId\": \"cameras\", \"brand\": \"Sony\", \"colour\": \"Blacks\", \"size\": \"Small\", \"quality\": \"High\", \"price\": 189.99, \"importance\": 150 }"),
        JObject.Parse("{ \"gtin\": 8, \"categoryId\": \"cameras\", \"brand\": \"Nikon\", \"colour\": \"Blacks\", \"size\": \"Large\", \"quality\": \"Medium\", \"price\": 129.99, \"importance\": 13 }"),
        JObject.Parse("{ \"gtin\": 9, \"categoryId\": \"cameras\", \"brand\": \"Canon\", \"colour\": \"Reds\", \"size\": \"Small\", \"quality\": \"High\", \"price\": 179.99, \"importance\": 175 }"),
        JObject.Parse("{ \"gtin\": 10, \"categoryId\": \"cameras\", \"brand\": \"Nikon\", \"colour\": \"Silvers\", \"size\": \"Small\", \"quality\": \"High\", \"price\": 185.99, \"importance\": 163 }"),
        JObject.Parse("{ \"gtin\": 11, \"categoryId\": \"cameras\", \"brand\": \"Nikon\", \"colour\": \"Blacks\", \"size\": \"Large\", \"quality\": \"High\", \"price\": 159.99, \"importance\": 113 }"),
        JObject.Parse("{ \"gtin\": 12, \"categoryId\": \"cameras\", \"brand\": \"Nikon\", \"colour\": \"Silvers\", \"size\": \"Small\", \"quality\": \"Low\", \"price\": 69.99, \"importance\": 63 }"),
    };
}
我的计算方法如下所示:

public async Task<IList<JObject>> SortAsync(IList<JObject> products)
{
    _productListValidator.Validate(products, "gtin", "categoryId", "importance");

    var categoryId = products[0]["categoryId"]?.ToString();
    var sortations = await _sortationProvider.ListAsync(categoryId);
    if (sortations == null || sortations.Count == 0) return products;

    var orderedSortations = sortations.OrderBy(m => m.Order).ToList();
    var orderedProducts = products.OrderByDescending(m => Convert.ToInt32(m["importance"].ToString())).ToList();
    var groups = orderedProducts.GroupBy(m => m["importance"].ToString());

    var sortedProducts = orderedProducts.OrderBy(a => 1);
    foreach(var group in groups)
    {
        if (group.Count() == 1) continue;
        // TODO: re-order the grouped products by sortation
    }

    var t = sortedProducts.ToList();
    return t;
}
var groupProducts = group.ToList().OrderBy(a => 1);
var result = orderedSortations.Aggregate(groupProducts,
    (current, sortation) =>
    {
        if (sortation.Field.Equals("price", StringComparison.OrdinalIgnoreCase))
            return sortation.Expression.Equals("0") ? 
                current.ThenBy(m => Convert.ToDecimal(m["price"].ToString())) :
                current.ThenByDescending(m => Convert.ToDecimal(m["price"].ToString()));

        return current.ThenByDescending(m => m.ContainsKey(sortation.Field) && m[sortation.Field].ToString().Equals(sortation.Expression));
    }).ToList();
var gtins = result.Select(m => m["gtin"].ToString()).ToList();
sortedProducts = sortedProducts.ThenBy(m => gtins.IndexOf(m["gtin"].ToString()));
public async Task<IList<JObject>> SortAsync(IList<JObject> products)
    {
        _productListValidator.Validate(products, "gtin", "categoryId", "importance");
    var categoryId = products[0]["categoryId"]?.ToString();
    var sortations = await _sortationProvider.ListAsync(categoryId);
    if (sortations == null || sortations.Count == 0) return products;

    var orderedSortations = sortations.OrderBy(m => m.Order).ToList();
    var orderedProducts = products.OrderByDescending(m => Convert.ToInt32(m["importance"].ToString())).ToList();
    var groups = orderedProducts.GroupBy(m => m["importance"].ToString());

    var sortedProducts = orderedProducts.OrderBy(a => 1);
    foreach(var group in groups)
    {
        if (group.Count() == 1) continue;

    var groupProducts = group.ToList().OrderBy(a => 1);
    var result = orderedSortations.Aggregate(groupProducts,
        (current, sortation) =>
        {
            if (sortation.Field.Equals("price", StringComparison.OrdinalIgnoreCase))
                return sortation.Expression.Equals("0") ? 
                    current.ThenBy(m => Convert.ToDecimal(m["price"].ToString())) :
                    current.ThenByDescending(m => Convert.ToDecimal(m["price"].ToString()));

            return current.ThenByDescending(m => m.ContainsKey(sortation.Field) && m[sortation.Field].ToString().Equals(sortation.Expression));
        }).ToList();
    var gtins = result.Select(m => m["gtin"].ToString()).ToList();
    sortedProducts = sortedProducts.ThenBy(m => gtins.IndexOf(m["gtin"].ToString()));
    }

    var t = sortedProducts.ToList();
    return t;
}
因此,完整方法如下所示:

public async Task<IList<JObject>> SortAsync(IList<JObject> products)
{
    _productListValidator.Validate(products, "gtin", "categoryId", "importance");

    var categoryId = products[0]["categoryId"]?.ToString();
    var sortations = await _sortationProvider.ListAsync(categoryId);
    if (sortations == null || sortations.Count == 0) return products;

    var orderedSortations = sortations.OrderBy(m => m.Order).ToList();
    var orderedProducts = products.OrderByDescending(m => Convert.ToInt32(m["importance"].ToString())).ToList();
    var groups = orderedProducts.GroupBy(m => m["importance"].ToString());

    var sortedProducts = orderedProducts.OrderBy(a => 1);
    foreach(var group in groups)
    {
        if (group.Count() == 1) continue;
        // TODO: re-order the grouped products by sortation
    }

    var t = sortedProducts.ToList();
    return t;
}
var groupProducts = group.ToList().OrderBy(a => 1);
var result = orderedSortations.Aggregate(groupProducts,
    (current, sortation) =>
    {
        if (sortation.Field.Equals("price", StringComparison.OrdinalIgnoreCase))
            return sortation.Expression.Equals("0") ? 
                current.ThenBy(m => Convert.ToDecimal(m["price"].ToString())) :
                current.ThenByDescending(m => Convert.ToDecimal(m["price"].ToString()));

        return current.ThenByDescending(m => m.ContainsKey(sortation.Field) && m[sortation.Field].ToString().Equals(sortation.Expression));
    }).ToList();
var gtins = result.Select(m => m["gtin"].ToString()).ToList();
sortedProducts = sortedProducts.ThenBy(m => gtins.IndexOf(m["gtin"].ToString()));
public async Task<IList<JObject>> SortAsync(IList<JObject> products)
    {
        _productListValidator.Validate(products, "gtin", "categoryId", "importance");
    var categoryId = products[0]["categoryId"]?.ToString();
    var sortations = await _sortationProvider.ListAsync(categoryId);
    if (sortations == null || sortations.Count == 0) return products;

    var orderedSortations = sortations.OrderBy(m => m.Order).ToList();
    var orderedProducts = products.OrderByDescending(m => Convert.ToInt32(m["importance"].ToString())).ToList();
    var groups = orderedProducts.GroupBy(m => m["importance"].ToString());

    var sortedProducts = orderedProducts.OrderBy(a => 1);
    foreach(var group in groups)
    {
        if (group.Count() == 1) continue;

    var groupProducts = group.ToList().OrderBy(a => 1);
    var result = orderedSortations.Aggregate(groupProducts,
        (current, sortation) =>
        {
            if (sortation.Field.Equals("price", StringComparison.OrdinalIgnoreCase))
                return sortation.Expression.Equals("0") ? 
                    current.ThenBy(m => Convert.ToDecimal(m["price"].ToString())) :
                    current.ThenByDescending(m => Convert.ToDecimal(m["price"].ToString()));

            return current.ThenByDescending(m => m.ContainsKey(sortation.Field) && m[sortation.Field].ToString().Equals(sortation.Expression));
        }).ToList();
    var gtins = result.Select(m => m["gtin"].ToString()).ToList();
    sortedProducts = sortedProducts.ThenBy(m => gtins.IndexOf(m["gtin"].ToString()));
    }

    var t = sortedProducts.ToList();
    return t;
}
公共异步任务排序同步(IList产品)
{
_验证(产品,“gtin”、“类别ID”、“重要性”);
var categoryId=产品[0][“categoryId”]?.ToString();
var sortations=await _sortationProvider.ListAsync(categoryId);
if(sortations==null | | sortations.Count==0)返回产品;
var orderedSortations=sortations.OrderBy(m=>m.Order.ToList();
var orderedProducts=products.OrderByDescending(m=>Convert.ToInt32(m[“重要性”].ToString()).ToList();
var groups=orderedProducts.GroupBy(m=>m[“重要性”].ToString());
var sortedProducts=orderedProducts.OrderBy(a=>1);
foreach(组中的var组)
{
如果(group.Count()==1)继续;
var groupProducts=group.ToList().OrderBy(a=>1);
var结果=orderedSortations.Aggregate(groupProducts,
(当前分类)=>
{
if(sortation.Field.Equals(“price”,StringComparison.OrdinalIgnoreCase))
返回sortation.Expression.Equals(“0”)?
current.ThenBy(m=>Convert.ToDecimal(m[“price”].ToString()):
当前.然后按降序(m=>Convert.ToDecimal(m[“price”].ToString());
返回current.thenbysending(m=>m.ContainsKey(sortation.Field)和&m[sortation.Field].ToString().Equals(sortation.Expression));
}).ToList();
var gtins=result.Select(m=>m[“gtin”].ToString()).ToList();
sortedProducts=sortedProducts.ThenBy(m=>gtins.IndexOf(m[“gtin”].ToString());
}
var t=sortedProducts.ToList();
返回t;
}
问题是,尽管它确实正确订购了这两种产品,但它将它们放在了我列表的底部:( 有人能帮我在当前位置上排序吗


您应该能够获取代码并运行它,如果您需要更多信息,请告诉我。

我想我成功地做到了这一点。我的方法还可以,我应该在完成排序后按重要性排序:

return sortedProducts.OrderByDescending(m => Convert.ToInt32(m["importance"].ToString())).ToList();

我删除了此调用的第一个实例,效果很好。

您使用的是current.ThenBy和current.ThenBy Descending。两者应该是升序还是降序。