关于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);

关于c#中的多维数组排序

如果使用以下代码,您可以将现有的数组列表字典转换为字典集合,从而允许使用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]);
}