如何按字段对列表进行排序

本文关键字:排序 列表 何按 字段 | 更新日期: 2023-09-27 18:12:17

大家好

我有一个对象列表

我的对象像

Product = "iPhone"; 
Category = "SmartPhone";
Product = "HP"; 
Category = "PC";
Product = "HTC"; 
Category = "SmartPhone";

然后我将每个对象插入到test中所以就像

List<Myobject> MyList = new List<Myobject>();

现在我需要按类别

对MyList进行排序

因为我需要我的列表首先显示智能手机类别然后显示其他

如何按字段对列表进行排序

您可以使用List。

排序
l.Sort((p, q) => p.Category.CompareTo(q.Category));

与LINQ OrderBy相比的优点是,您将对列表进行就地排序,而不是生成IOrderedEnumerable<T>,然后您必须在List<T>中重新转换。

查看LINQ order扩展方法

MyList.OrderBy (p => p.Category);

如果你需要一个更复杂的方式来排序类别,你可以创建一个类来实现IComparer接口,并在其中实现你的排序逻辑。

        public class SmartphonesFirst : IComparer<Product>
        {
            const string Smartphone = "Smartphone";
            public int Compare( Product x, Product y )
            {
                if( x.Category == Smartphone && y.Category != Smartphone )
                {
                    return -1;
                }
                if( y.Category == Smartphone && x.Category != Smartphone )
                {
                    return 1;
                }
                else
                {
                    return Comparer<String>.Default.Compare (x.Category, y.Category);
                }
            }
        }

你可以不使用LINQ:

            var l = new List<Product> ();
            l.Add (new Product ()
            {
                Name = "Omnia 7",
                Category = "Smartphone"
            });
            l.Add (new Product ()
            {
                Name = "Mercedes",
                Category = "Car"
            });
            l.Add (new Product ()
            {
                Name = "HTC",
                Category = "Smartphone"
            });
            l.Add (new Product ()
            {
                Name = "AMD",
                Category = "CPU"
            });
            l.Sort (new SmartphonesFirst ());
            foreach( var p in l )
            {
                Console.WriteLine (String.Format ("{0} : {1}", p.Category, p.Name));
            }

或者,使用LINQ:

            var l = new List<Product> ();
            l.Add (new Product ()
            {
                Name = "Omnia 7",
                Category = "Smartphone"
            });
            l.Add (new Product ()
            {
                Name = "Mercedes",
                Category = "Car"
            });
            l.Add (new Product ()
            {
                Name = "HTC",
                Category = "Smartphone"
            });
            l.Add (new Product ()
            {
                Name = "AMD",
                Category = "CPU"
            });
            var sorted = l.OrderBy (p => p, new SmartphonesFirst ());
            foreach ( var p in sorted )
            {
                Console.WriteLine (String.Format ("{0} : {1}", p.Category, p.Name));
            }

您可以使用Sort方法和自定义比较,按类别(降序)排序,然后按产品(升序)排序:

MyList.Sort((a, b) => {
  // compare b to a to get descending order
  int result = b.Category.CompareTo(a.Category);
  if (result == 0) {
    // if categories are the same, sort by product
    result = a.Product.CompareTo(b.Product);
  }
  return result;
});

如果您想单独列出智能手机,然后升序排序:

MyList.Sort((a, b) => {
  int result = (a.Category == "SmartPhone" ? 0 : 1) - (b.Category == "SmartPhone" ? 0 : 1);
  if (result == 0) {
    result = a.Category.CompareTo(b.Category);
    if (result == 0) {
      result = a.Product.CompareTo(b.Product);
    }
  }
  return result;
});