Предотвращение повторения кода при использовании LINQ

Я решил проблему с помощью следующего кода, который отлично работает с каждым аспектом, упомянутым в вопросе, подобным Snapchat и Instagram:

var pointSize: CGFloat = 0
@objc func pinchRecoginze(_ pinchGesture: UIPinchGestureRecognizer) {
    guard pinchGesture.view != nil else {return}

    let view = pinchGesture.view!
    if (pinchGesture.view is UILabel) {
        let textLabel = view as! UILabel

        if pinchGesture.state == .began {
            let font = textLabel.font
            pointSize = font!.pointSize

            pinchGesture.scale = textLabel.font!.pointSize * 0.1
        }
        if 1 <= pinchGesture.scale && pinchGesture.scale <= 10  {
            textLabel.font = UIFont(name: textLabel.font!.fontName, size: pinchGesture.scale * 10)

            resizeLabelToText(textLabel: textLabel)
        }
    }
}

func resizeLabelToText(textLabel : UILabel) {
    let labelSize = textLabel.intrinsicContentSize
    textLabel.bounds.size = labelSize
}
6
задан Lee Treveil 27 January 2009 в 22:16
поделиться

4 ответа

Необходимо смочь имитировать подпись метода расширения OrderBy:

Обновите 1, необходимо быть явными в первом универсальном параметре к keySelector Func. Я собираюсь взять предположение в Вашем типе и назвать его "Песней".

public void Sort<TKey>(SortOrder sortOrder,
                       Func<Song, TKey> keySelector)
{
    if (sortOrder == SortOrder.Descending)
    {
        _list = _list.OrderByDescending(keySelector).ToList(); 
    }
    else
    {
        _list = _list.OrderBy(keySelector).ToList(); 
    }
}

Теперь можно назвать "Вид" как это:

Sort(SortOrder.Descending, x => x.Album);

Обновление 2

Развитие комментария Tom Lokhorst: Если Вы хотите предопределить некоторые краткие критерии сортировки, Вы могли бы сделать так путем определения класса как это:

public static class SortColumn
{
    public static readonly Func<Song, string> Artist = x => x.Artist;
    public static readonly Func<Song, string> Album = x => x.Album;
}

Теперь можно просто звонить:

Sort(SortOrder.Descending, SortColumn.Artist);
12
ответ дан 8 December 2019 в 18:42
поделиться

Вы могли бы попытаться использовать универсальный компаратор.

2
ответ дан 8 December 2019 в 18:42
поделиться

Я думаю, что необходимо добавить дополнительный метод к IList<T>:

 public static class extIList {
    public static IList<T> Sort<T, TKey>(this IList<T> list, SortOrder sortOrder, Func<T, TKey> keySelector) {
            if (sortOrder == SortOrder.Descending) {
                return list.OrderByDescending(keySelector).ToList();
            } else {
                return list.OrderBy(keySelector).ToList();
            }
    }
}

и затем можно использовать симпатичный с каждый Вашим объекты:

IList<Person> list = new List<Person>();

list.Add(new Person("David","Beckham"));
list.Add(new Person("Gennaro","Gattuso"));
list.Add(new Person("Cristian","Carlesso"));

list = list.Sort(SortOrder.Descending, X => X.Name);

PS SortOrder уже существует:

using System.Data.SqlClient;
0
ответ дан 8 December 2019 в 18:42
поделиться

Кажется, что сортировка берет собственную жизнь, если у Вас есть несколько методов, выделенных ей. Возможно, они могут быть собраны в класс.

public enum SortOrder
{
    Ascending = 0,
    Descending = 1
}
public class Sorter<T>
{
    public SortOrder Direction { get; set; }
    public Func<T, object> Target { get; set; }
    public Sorter<T> NextSort { get; set; }

    public IOrderedEnumerable<T> ApplySorting(IEnumerable<T> source)
    {
        IOrderedEnumerable<T> result = Direction == SortOrder.Descending ?
            source.OrderByDescending(Target) : 
            source.OrderBy(Target);

        if (NextSort != null)
        {
            result = NextSort.ApplyNextSorting(result);
        }
        return result;
    }

    private IOrderedEnumerable<T> ApplyNextSorting
        (IOrderedEnumerable<T> source)
    {
        IOrderedEnumerable<T> result = Direction == SortOrder.Descending ?
            source.ThenByDescending(Target) :
            source.ThenBy(Target);
        return result;
    }
}

Вот демонстрационное использование:

List<string> source = new List<string>()
    { "John", "Paul", "George", "Ringo" };

Sorter<string> mySorter = new Sorter<string>()
{
    Target = s => s.Length,
    NextSort = new Sorter<string>()
    {
        Direction = SortOrder.Descending,
        Target = s => s
    }
};

foreach (string s in mySorter.ApplySorting(source))
{
    Console.WriteLine(s);
}

Выводом является Paul, John, Ringo, George.

-1
ответ дан 8 December 2019 в 18:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: