如何对对象集合进行排序,必须根据一些不断变化的参数进行排序
本文关键字:排序 参数 变化 对象 集合 | 更新日期: 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;
});
来源:来自我的旧博客