如何对对象集合进行排序,必须根据一些不断变化的参数进行排序

本文关键字:排序 参数 变化 对象 集合 | 更新日期: 2023-09-27 18:31:00

我正在寻找如何使用加权值有效地对列表进行排序。

每个项目都有一个 ID、名称和文件路径。每个项目还有一个值列表,这些值分配了一个百分比,显示它们与每个值的相关性。

我需要对列表进行排序,以便列表顶部的项目是与当前参数最相关的项目。

比方说,

项目一:

  • 答: 50, 乙: 30, C : 20, 深: 10
  • X : 50, Z :20

项目二:

  • 答:100, 乙:0, C:0, 深:0
  • X:0, Z:100
显然,项目

二应该在我的列表顶部,因为它是最相关的项目。但是我将如何实现这一点呢?

奖励:如果能够进行轻微的随机化,那就太好了,我不想每次都提供明确的相关项目。

谢谢

如何对对象集合进行排序,必须根据一些不断变化的参数进行排序

假设您知道您的加权函数,则可以使用 Linq to Objects:

var sorted = (from o in myList orderby o.SortingValue select o).ToList();

在此示例中,SortingValue将是对象上的一个属性,用于封装问题中的属性并实现算法。

排序值的示例算法:

您可以使用字典来保存相关性百分比

然后,您的"当前参数"可以用作字典的键,以获得相关的权重:

Dictionary<string, double> weightDictionary = // Load somehow
double SortingValue
{
    get {
        double sortingValue;
        foreach(string currentParameter in currentParameters)
        {
            sortingValue += weightDictionary[currentParameter];
        }
        // You could use Math.Random to get a number between say -0.1 and -.1.  
        // Multiply sortingValue by that random number.
        return sortingValue;
    }
}

很久以前,我为此目的创建了一个扩展方法。我刚刚再次遇到对它的需求:

public static IOrderedEnumerable<TSource> OrderByWeight<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TKey, int> weighting) where TKey : IComparable
{
    Dictionary<TSource, int> order = new Dictionary<TSource, int>();
    foreach (TSource item in source)
    {
        if (!order.ContainsKey(item)) order.Add(item, weighting(keySelector(item)));
    }
    return source.OrderBy(s => order[s]);
}

你可以像这样使用它:

var data = dt.Select(g => new
{
    Season = g.season,
    AverageTemp = g.temp
}).OrderByWeight(a => a.Season, x =>
{
    if (x == "WINTER") return 1;
    if (x == "SPRING") return 2;
    if (x == "SUMMER") return 3;
    if (x == "AUTUMN") return 4;
    return 99;
});

来源:来自我的旧博客