Comparers, 你所需要的最后一个比较库 !

分享于 

7分钟阅读

GitHub

  繁體 雙語
The last comparison library you'll ever need!
  • 源代码名称:Comparers
  • 源代码网址:http://www.github.com/StephenCleary/Comparers
  • Comparers源代码文档
  • Comparers源代码下载
  • Git URL:
    git://www.github.com/StephenCleary/Comparers.git
    Git Clone代码到本地:
    git clone http://www.github.com/StephenCleary/Comparers
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/StephenCleary/Comparers
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    

    Logo

    Comparers

    你所需要的最后一个比较库 ! 用于 netstandard1.0 ( 包括. NET 4.5,.NET 内核 1.0,Xamarin.iOS 10,Xamarin.Android 7,单声道 4.6,通用 Windows 10,Windows 8,Windows Phone 应用程序 8.1和 Windows Phone Silverlight )。

    AppVeyorCoverallsNuGet Pre Release

    API文档

    创建过程

    安装 NuGet软件包。 默认情况下,这包括用于LINQ支持的扩展包。 还有可以用于React扩展的扩展包和交互扩展插件支持。

    比较器类型位于命名空间 Nito.Comparers 中。

    假设你已经获得了POCOs的集合:

    classPerson{
     public stringFirstName { get; }
     public stringLastName { get; }
    }List<Person> list =.. .;

    下面是按姓氏和名字对它们进行排序的简单方法:

    IComparer<Person> nameComparer = ComparerBuilder.For<Person>()
    . OrderBy(p => p.LastName)
    . ThenBy(p => p.FirstName);list.Sort(nameComparer);

    实现可以比较类型

    那么 Having 人员如何实现它? 让我们面对它:在. NET 中实现比较是一个真正的痛苦。 IComparable<T>IComparableIEquatable<T>Object.Equals,和 Object.GetHashCode? ! 但是,使用基类型很容易:

    classPerson : ComparableBase<Person>
    {
     staticPerson {
     DefaultComparer = ComparerBuilder.For<Person>()
    . OrderBy(p => p.LastName)
    . ThenBy(p => p.FirstName);
     }
     public stringFirstName { get; }
     public stringLastName { get; }
    }

    ComparableBase<T> 自动模糊实现所有可以比较的接口,包括 Object.EqualsObject.GetHashCode的正确替代。

    在哈希容器中使用发生程序

    基于散列的容器由by库生成的每个比较器还实现相等比较? !

    IEqualityComparer<Person> nameComparer = ComparerBuilder.For<Person>()
    . OrderBy(p => p.LastName)
    . ThenBy(p => p.FirstName);Dictionary<Person, Address> dict = new Dictionary<Person, Address>(nameComparer);

    Comparers

    有时,你只能定义相等性。 好的,好的news: 有相等的比较器类型,它们平行于完整的比较器类型。

    classEntity : EquatableBase<Entity>
    {
     staticEntity()
     {
     DefaultComparer = EqualityComparerBuilder.For<Entity>().EquateBy(e => e.Id);
     }
     public intId { get; }
    }

    处理序列

    序列按字典排序 Sequence 运算符为一种类型采用现有比较器,并为该类型的序列定义字典比较器:

    varnameComparer = ComparerBuilder.For<Person>()
    . OrderBy(p => p.LastName)
    . ThenBy(p => p.FirstName);List<IEnumerable<Person>> groups =.. .;groups.Sort(nameComparer.Sequence());

    LINQ,Rx和Ix也有自然扩展:

    IEnumerable<Person> people =.. .;varanonymousProjection = people.Select(x => new { GivenName = x.FirstName, Surname = x.LastName });varreduced = anonymousProjection.Distinct(c => c.EquateBy(x => x.Surname));

    动态排序

    需要在运行时动态排序? ( 为什么 不 呢?

    varsortByProperties = new[] { "LastName", "FirstName" };IComparer<Person> comparer = ComparerBuilder.For<Person>().Null();foreach (var propertyName in sortByProperties)
    {
     varlocalPropertyName = propertyName;
     Func<Person, string> selector = p => p.GetType().GetProperty(localPropertyName).GetValue(p, null) asstring;
     comparer = comparer.ThenBy(selector);
    }

    复杂排序

    想要一个可爱的魔术这里有一个:? true 是"大于" false,所以如果你想要对某些奇怪的条件进行 ORDER BY,那么它并不太难:

    //Use the default sort order (last name, then first name), EXCEPT all"Smith"s move to the head of the line.varcomparer = ComparerBuilder.For<Person>()
    . OrderBy(p => p.LastName == "Smith", descending: true)
    . ThenBy(ComparerBuilder.For<Person>().Default());list.Sort(comparer);

    默认情况下,null 值是"小于",但你可以使用相同的技巧对它们进行排序:

    List<int?> myInts =.. .;varcomparer = ComparerBuilder.For<int?>()
    . OrderBy(i => i == null, specialNullHandling: true)
    . ThenBy(ComparerBuilder.For<int?>().Default());myInts.Sort(comparer);//Yeah, we need to pass"specialNullHandling"; otherwise, the default null-ordering rules will apply.

    ? !

    有关详细信息,请参见详细文档。

    ,飞碟是什么?

    其他语言提供了一个比较运算符 <=>,它被称为"宇宙飞船操作员"。 这个库为 C# 提供了类似的功能,因此。


    COM  
    相关文章