关于c#中的多维数组排序
本文关键字:数组排序 关于 | 更新日期: 2023-09-27 18:08:32
我正试图找出一种方法来正确排序一堆不同的数组列表。我正在发布内容文章,数组列表中的每个值[0]将与每个其他值[0]相关。等等......每个元素组成完整内容项的集合部分。
现在,最后一个元素,人气,是一个项目收到的点击量。我该怎么做?在不混淆每篇文章的HTML的情况下,根据流行程度对内容项进行排序?
*编辑我受。net 2.0框架的限制*
下面是代码…谢谢。
public class MultiDimDictList : Dictionary<string, ArrayList> { }
myDicList.Add("fly", a_fly);
myDicList.Add("img", a_img);
myDicList.Add("bar", a_bar);
myDicList.Add("meter", a_meter);
myDicList.Add("block", a_block);
myDicList.Add("popularity", a_pop);
如果使用以下代码,您可以将现有的数组列表字典转换为字典集合,从而允许使用Linq OrderBy进行简单排序
// Get the shortest arraylist length (they should be equal this is just a paranoia check!)
var count=myDicList.Values.Min(x=>x.Count);
// Get the collection of Keys
var keys=myDicList.Keys;
// Perform the conversion
var result=Enumerable.Range(0,count).Select(i=>keys.Select(k=>new {Key=k,Value=myDicList[k][i]}).ToDictionary(x=>x.Key,x=>x.Value));
var sorted=result.OrderByDescending(x=>x["popularity"]).ToList()
——编辑。net 2.0版本
首先需要一个比较器类
class PopularityComparison : IComparer<Dictionary<string,object>> {
private bool _sortAscending;
public PopularityComparison(bool sortAscending) {
_sortAscending = sortAscending;
}
public int Compare(Dictionary<string, object> x, Dictionary<string, object> y) {
object xValue = x["popularity"];
object yValue = y["popularity"];
// Sort Ascending
if (_sortAscending) {
return Comparer.Default.Compare(xValue, yValue);
} else {
return Comparer.Default.Compare(yValue, xValue);
}
}
}
然后可以使用下面的代码
// Get the shortest arraylist length (they should be equal this is just a paranoia check!)
// Replacement for min
int count = int.MaxValue;
foreach (ArrayList a in myDicList.Values) if (a.Count < count) count = a.Count;
// Get the collection of Keys
Dictionary<string, ArrayList>.KeyCollection keys = myDicList.Keys;
// Perform the conversion
List<Dictionary<string, object>> result = new List<Dictionary<string, object>>(count);
for (int i = 0; i < count; i++) {
Dictionary<string, object> row = new Dictionary<string, object>(keys.Count);
foreach (string key in keys) row.Add(key, myDicList[key][i]);
result.Add(row);
}
最后按流行度升序排序
result.Sort(new PopularityComparison(true));
或降序
result.Sort(new PopularityComparison(true));
我认为最好有一个包含您的键作为属性的对象,然后在您的数组列表中包含每个项目的单个集合。
这样您将有一个单一的集合排序,如果使用Linq.OrderBy(),这将变得微不足道。
之类的…
public class Article
{
public string Fly{get;set;}
public string Img{get;set;}
// etc.
public float Popularity{get;set;}
}
然后……
List<Article> articles = ... get from somewhere, or convert from your array lists.
List<Article> sorted = articles.OrderBy(a=>a.Popularity).ToList();
请原谅这里的餐巾代码…如果你需要更详细的信息,我会更新的。
一个使用non-linq的例子。
创建IComparer的实现。
public class ArticleComparer : IComparer<Article>
{
public bool Accending { get; set; }
public int Compare(Article x, Article y)
{
float result = x.Popularity - y.Popularity;
if (!Accending) { result *= -1; }
if (result == 0) { return 0; }
if (result > 0) return 1;
return -1;
}
}
然后当你去排序List时,你可以做如下的事情:
ArticleComparer comparer = new ArticleComparer();
comparer.Accending = false;
articles.Sort(comparer);
如果您有一个条目对象列表,其中每个对象都包含fly
, img
, bar
, popularity
等属性,那么这将容易得多。但是,如果您确实必须使用这种由内到外的方法来存储内容,那么根据流行程度对内容项进行排序的唯一方法是创建另一个数组(或列表)来保存顺序。
创建一个新列表并使用顺序索引填充它:
List<int> OrderedByPopularity = new List<int>();
ArrayList popList = myDicList["popularity"];
for (int i = 0; i < popList.Count; ++i)
{
OrderedByPopularity.Add(i);
}
现在您有一个列表,其中包含流行度列表中项目的索引。现在你可以排序了:
OrderedByPopularity.Sort((i1, i2) => return popList[i1].CompareTo(popList[i2]););
但是你首先得到的是最不受欢迎的文章。如果你想反转排序,使OrderedByPopularity[0]
是最受欢迎的项目:
OrderedByPopularity.Sort((i1, i2) => { return popList[i2].CompareTo(popList[i1]);});
实际上,您应该考虑重新构建应用程序。处理具有属性的对象要比维护属性的并行数组容易得多。
如果你必须在。net 2.0中这样做,在类作用域(而不是方法作用域)声明poplist
数组,并创建一个比较方法。
ArrayList poplist;
void MyMethod()
{
List<int> OrderedByPopularity = new List<int>();
popList = myDicList["popularity"];
for (int i = 0; i < popList.Count; ++i)
{
OrderedByPopularity.Add(i);
}
OrderedByPopularity.Sort(PopularityComparison);
// ...
}
int PopularityComparison(int i1, int i2)
{
return ((int)popList[i2]).CompareTo((int)popList[i1]);
}