Объединение LINQ-Несколько Список <T> и порядок значением (.Net 3.5)

Быстрое исправление:

Чтобы удалить зазор под изображением, вы можете:

  • Установить свойство vertical-align изображения на vertical-align: bottom; vertical-align: top; или vertical-align: middle;
  • Установите для свойства отображения изображения значение display:block;

См. следующий код для живой демонстрации:

#vAlign img {
  vertical-align :bottom;
}
#block img{
  display:block;
}

div {border: 1px solid red;width:100px;}
img {width:100px;}

No fix:

With vertical-align:bottom; on image:

With display:block; on image:


Объяснение: почему существует пробел под изображением?

Разрыв или дополнительное пространство под изображением не является ошибкой или проблемой, это поведение по умолчанию. Основная причина заключается в том, что изображения заменяются элементами ( см. MDN и W3C ). Это позволяет им «действовать как изображение» и иметь собственные собственные размеры, соотношение сторон ... Браузеры вычисляют свое свойство отображения inline, но они придают им особое поведение, которое приближает их к элементам inline-block (так как вы

Это также означает, что:

[...] когда изображения используются во встроенном контексте форматирования с выравниванием по вертикали: базовая линия, нижняя часть изображения будет отображаться на базовой линии контейнера. ( source: MDN , focus mine )

blockquote>

Поскольку браузеры по умолчанию вычисляют свойство vertical-align для базовой линии, это значение по умолчанию поведение. На следующем изображении показано, где базовая линия находится по тексту:

Location of the baseline on text [/g15]

Элементы, выровненные по базовой линии, должны содержать место для дескрипторов которые простираются ниже базовой линии (например, j, p, g ...), как вы можете видеть на приведенном выше изображении. В этой конфигурации нижняя часть изображения выравнивается по базовой линии, как вы можете видеть в этом примере:

div{border:1px solid red;}
img{width:100px;height:auto;}
jpq are letters with descender

Вот почему поведение по умолчанию тега создает пробел в нижней части его контейнера и почему изменение свойства вертикального выравнивания или свойства отображения удаляет его, как в следующей демонстрации:

div {width: 100px;border: 1px solid red;}
img {width: 100px;height: auto;}

.block img{
  display:block;
}
.bottom img{
  vertical-align:bottom;
}

Default:

With display:block;

With vertical-align:bottom;

21
задан Jay Bazuzi 28 December 2008 в 20:45
поделиться

2 ответа

У Вас есть три списка здесь - чем точно Вы пытающийся заказать?

Ваш бросок является неправильным также - результат будет IEnumerable<X>, где X анонимный тип с три T с в.

, Если идея действительно к , конкатенируют три списка и затем вид, Вы хотите:

return one.Concat(two)
          .Concat(three)
          .OrderByDescending(x => x.GetTime())
          .ToList();
26
ответ дан 29 November 2019 в 21:24
поделиться

Вот то, как я сделал бы это:

public static List<T> Combine<T, TKey>
(
  Func<T, TKey> orderingFunction,
  params IEnumerable<T>[] theParams
)
  where TKey : IComparable
{
  return theParams
    .SelectMany(x => x)
    .OrderBy(orderingFunction)
    .ToList();
}

Вот некоторый тестовый код:

    public static void Test1()
    {
        List<int> a = new List<int>() { 1, 2, 3 };
        List<int> b = new List<int>() { 3, 2, 1 };
        List<int> c = CombineLists.Combine(i => i, a, b);
        c.ForEach(i => Console.WriteLine(i));
    }

Вот история:

public static List<T> Combine<T, TKey>
(
  Func<T, TKey> orderingFunction,
  params IEnumerable<T>[] theParams
)
  where TKey : IComparable

Эта подпись объявляет метод, который берет два параметра типа, некоторую функцию упорядочивания и набор наборов. Заметьте, что типы T и TKey не определяются явно в проверочном вызове. Компилятор имеет немного загадки для выяснения, каковы эти типы. Сначала это осматривает IEnumerables, который это было дано (a и b) и обнаруживает, что они - IEnumerable интервала Ага, T должен быть интервалом Тогда, это осматривает функцию упорядочивания и видит, что возвращает тот же тип, что это передается. Ага, TKey должен быть международный

, где довольно забавно. OrderBy должен проверить (во время компиляции), что TKey является IComparable. Это только проверяет во времени выполнения, таким образом, мы добираемся, чтобы сделать, время компиляции регистрируется в нашем коде.

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

        return theParams
            .SelectMany(x => x)
            .OrderBy(orderingFunction)
            .ToList();

SelectMany распаковывает набор наборов. Это - способ сгладить один уровень иерархии. OrderBy берет некоторую функцию, что проекты каждый элемент к упорядочиваемому значению, и заказывают элементы согласно тем значениям. ToList перечисляет запрос и возвращает список. Никакие неожиданности там.

4
ответ дан 29 November 2019 в 21:24
поделиться
Другие вопросы по тегам:

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