针对“C# 泛型集合的自定义类型排序的实现”的完整攻略,我们可以分为以下几个步骤来展开:
- 自定义类型实现 IComparable 接口
- 使用 Comparer
类进行排序 - 示例说明
下面我们一一进行详解。
自定义类型实现 IComparable 接口
首先,为了让我们自定义的类型可以进行排序,我们需要让它实现 System.IComparable
接口。具体实现细节是,我们需要在自定义类型中定义一个 CompareTo
方法,该方法的参数为当前类型的对象,其返回值为整型,表示我们要比较的两个对象的相对大小。返回值为负数,表示当前对象小于比较对象;返回值为正数,表示当前对象大于比较对象;返回值为零,表示当前对象等于比较对象。具体代码实例如下:
public class Person : IComparable<Person>
{
public string Name { get; set; }
public int Age { get; set; }
public int CompareTo(Person other)
{
if (this.Age == other.Age)
{
return 0;
}
else if (this.Age > other.Age)
{
return 1;
}
else
{
return -1;
}
}
}
在代码中,我们定义了一个 Person
类,并实现了 IComparable<Person>
接口中的 CompareTo
方法。在 CompareTo
方法中,我们按照 Age
属性作为比较的依据,当两个 Person
实例的 Age
相同时,我们返回 0,表示相等;当当前实例的 Age
大于比较实例的 Age
时,返回 1;否则,返回 -1。
使用 Comparer 类进行排序
实现 IComparable
接口之后,我们就可以使用 List<T>
、IList<T>
、IEnumerable<T>
等泛型集合整体排序了。但通常来讲,我们往往需要使用更加灵活的排序方式,在此,我们使用 System.Collections.Generic.Comparer<T>
类。
具体来说,我们需要自定义一个 IComparer<T>
接口的实现类,该类中的 Compare
方法的参数为我们要比较的两个对象,其返回值与 IComparable
接口中的 CompareTo
方法一致。
具体代码实例如下:
public class PersonComparer : Comparer<Person>
{
public bool Descending { get; set; } = false;
public override int Compare(Person x, Person y)
{
int result = x.CompareTo(y);
if (Descending)
{
result = result * -1;
}
return result;
}
}
在代码中,我们定义了一个 PersonComparer
类,继承自 System.Collections.Generic.Comparer<Person>
类,并重载了 Compare
方法,实现了自定义类型的排序。在 Compare
方法中,我们利用 IComparable
接口中定义的 CompareTo
方法进行比较,并将比较结果进行取反,从而实现了降序排序。当然,如果要实现升序排序,只需要将 result = result * -1
的代码删除即可。
示例说明
下面我们来分别举例说明如何使用 IComparable
接口和 Comparer<T>
类进行自定义类型的排序。
示例1:
在这个示例中,我们创建了一个 List<Person>
对象,填充了多个 Person
对象,并按照 Person.Age
属性进行排序,从而输出按年龄升序排序的 Person
集合。具体代码如下:
var personList = new List<Person>()
{
new Person(){ Name = "小明", Age = 20 },
new Person(){ Name = "小红", Age = 22 },
new Person(){ Name = "小芳", Age = 18 },
new Person(){ Name = "小可", Age = 24 }
};
personList.Sort();
foreach (var person in personList)
{
Console.WriteLine($"Name:{person.Name}, Age:{person.Age}");
}
示例2:
在这个示例中,我们创建了一个 List<Person>
对象,填充了多个 Person
对象,并按照 Person.Age
属性进行排序,从而输出按年龄降序排序的 Person
集合。具体代码如下:
var personList = new List<Person>()
{
new Person(){ Name = "小明", Age = 20 },
new Person(){ Name = "小红", Age = 22 },
new Person(){ Name = "小芳", Age = 18 },
new Person(){ Name = "小可", Age = 24 }
};
var comparer = new PersonComparer()
{
Descending = true
};
personList.Sort(comparer);
foreach (var person in personList)
{
Console.WriteLine($"Name:{person.Name}, Age:{person.Age}");
}
在这里,我们定义了一个 PersonComparer
对象,并将其 Descending
属性设置为 true
,表示按照降序排列。然后,将其传入 personList.Sort
方法中,就实现了自定义类型的降序排序。
至此,我们对“C# 泛型集合的自定义类型排序的实现”的攻略就介绍完毕了。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# 泛型集合的自定义类型排序的实现 - Python技术站