【问题标题】:Sort an array of strongly typed objects based on a property of the object根据对象的属性对强类型对象数组进行排序
【发布时间】:2018-07-09 22:22:38
【问题描述】:

我有一个array[] 的对象,由于某些原因我无法将其更改为List<>,是否可以根据对象的 1 个字段中的值对对象的array[] 进行排序?

例如

arrayOfFruit[] fruit; 

fruit.sort(name);

【问题讨论】:

标签: c# arrays


【解决方案1】:

使用 Array..::.Sort 方法(Array, IComparer)

http://msdn.microsoft.com/en-us/library/aw9s5t8f.aspx

【讨论】:

    【解决方案2】:

    如果您想清楚地区分 选择器比较器,您可以使用这个帮助器类。你不能有一个“类扩展方法”来给Array.Sort一组带选择器的重载,这太糟糕了。

    public static class SelectingComparer<T>
    {
        public static IComparer<T> Create<U>(Func<T, U> selector)
        {
            return new SelectingComparerImpl<U>(selector, null);
        }
    
        public static IComparer<T> Create<U>(Func<T, U> selector, IComparer<U> comparer)
        {
            return new SelectingComparerImpl<U>(selector, comparer.Compare);
        }
    
        public static IComparer<T> Create<U>(Func<T, U> selector, Comparison<U> comparison)
        {
            return new SelectingComparerImpl<U>(selector, comparison);
        }
    
        private class SelectingComparerImpl<U>
            : IComparer<T>
        {
            private Func<T, U> selector;
            private Comparison<U> comparer;
    
            public SelectingComparerImpl(Func<T, U> selector, Comparison<U> comparer)
            {
                if (selector == null)
                    throw new ArgumentNullException();
    
                this.selector = selector;
                this.comparer = comparer ?? Comparer<U>.Default.Compare;
            }
    
            public int Compare(T x, T y)
            {
                return this.comparer(this.selector(x), this.selector(y));
            }
        }
    }
    

    使用中:

    public class Testing
    {
        public void Foo()
        {
            FileInfo[] files = new FileInfo[30];
            // FILL THE FILE ARRAY
            Array.Sort(files, SelectingComparer<FileInfo>.Create(file => file.Name));
            Array.Sort(files, SelectingComparer<FileInfo>.Create(file => file.Name, StringComparer.OrdinalIgnoreCase));
        }
    }
    

    【讨论】:

      【解决方案3】:

      您可以使用IComparer 作为排序参数

      【讨论】:

        【解决方案4】:
        void SomeMethod()
        {
            Fruit fruits[] = GetArrayOfFruit();
            Array.Sort(fruits, FruitNameComparer);
        }
        
        int FruitNameComparer(Fruit lhsOfQEquals, Fruit rhsOfEquals)
        {
            return String.Compare(lhsOfQEquals.Name, rhsOfEquals.Name);
        }
        

        【讨论】:

          猜你喜欢
          • 2015-06-17
          • 2019-02-11
          • 1970-01-01
          • 1970-01-01
          • 2021-07-13
          • 2023-02-03
          • 1970-01-01
          • 2017-02-23
          • 2016-02-25
          相关资源
          最近更新 更多