Почему 'равняется' оператору в соединениях LINQ?

Если вы хотите использовать служебный метод, который преобразует общий тип Vector в соответствующий ArrayList, вы можете использовать следующее:

public static <T> ArrayList<T> toList(Vector<T> source) {
    return new ArrayList<T>(source);
}

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

public void myCode() {
    List<String> items = toList(someVector);
    System.out.println("items => " + items);
}

Вы также можете использовать встроенный java.util.Collections.list (перечисление) следующим образом:

public void myMethod() {
    Vector<String> stringVector = new Vector<String>();
    List<String> theList = Collections.list(stringVector.elements());
    System.out.println("theList => " + theList);
}

Но, как кто-то упоминал ниже, Vector is-a List! Так зачем вам это делать? Возможно, вы не хотите, чтобы какой-то код, который вы используете, знал, что он работает с вектором - возможно, он неуместно преуменьшает значение, и вы хотите устранить этот запах кода. Затем вы можете использовать

// the method i give my Vector to can't cast it to Vector
methodThatUsesList( Collections.unmodifiableList(theVector) );

, если список должен быть изменен. Изменяемая оболочка без манжеты:

public static <T> List<T> asList(final List<T> vector) {
    return new AbstractList<T>() {
        public E get(int index) { return vector.get(index); }
        public int size() { return vector.size(); }
        public E set(int index, E element) { return vector.set(index, element); }
        public void add(int index, E element) { vector.add(index, element); }
        public E remove(int index) { return vector.remove(index); }
    }
}
5
задан ProfK 25 October 2009 в 10:48
поделиться

2 ответа

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

from category in categories
join prod in products on category.ID equals prod.CategoryID

categories.Join(products,
                category => category.ID,
                prod => prod.CategoryID,
                (category, prod) => new { Category = category, Product=prod });

Использование ключевого слова equals делает однозначным, где заканчивается одна лямбда и начинается другая. С другой стороны, для предложения where существует одно лямбда-выражение, которое определяет соответствие каждого элемента:

from prod in products
where prod.CategoryID == 1

products.Where( prod => prod.CategoryID == 1 )

Теоретически объединения можно было бы реализовать с помощью одного лямбда-выражения as

from category in categories
join prod in products on category.ID == prod.CategoryID

categories.Join(products,
                (category, prod) => category.ID == prod.CategoryID,
                (category, prod) => new { Category = category, Product=prod });

Однако, вычислив два ключа и выполнив Само сравнение LINQ может использовать хэш-таблицы для более эффективного вычисления соединения, чем если бы ему приходилось выполнять произвольное сравнение для каждой пары элементов.

10
ответ дан 18 December 2019 в 10:46
поделиться

Вы должны спросить дизайнеров, но ясно, что разрешение любого (логического) выражения допускает слишком много возможностей. Использование специального ключевого слова, такого как равно , значительно упрощает его привязку к спецификации в виде двух столбцов.

Я нашел обсуждение The Moth .

6
ответ дан 18 December 2019 в 10:46
поделиться
Другие вопросы по тегам:

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