Самый быстрый способ сравнить два списка

попробуйте это:

...
vl integer := 4;
sql_stmt varchar2(200);
v_hint varchar2(100);

begin

v_hint := '/*+ PARALELL('||vl||') */'
sql_stmt := 'SELECT'||' '||V_HINT||' '||'* from employee'

...
10
задан Fionnuala 4 January 2009 в 17:39
поделиться

6 ответов

Вот шаги, которые я сделал бы:

  1. Сделайте объект. ReferenceEquals () если это правда, затем возвратите true.
  2. Проверьте количество, если не то же, возвратите false.
  3. Сравните элементы один за другим.

Вот некоторые предложения для метода:

  1. Основывайте реализацию на ICollection. Это дает Вам количество, но не ограничивает определенным типом набора или содержавшим типом.
  2. Можно реализовать метод как дополнительный метод к ICollection.
  3. Необходимо будет использовать.Equals () для сравнения элементов списка.
13
ответ дан 3 December 2019 в 14:00
поделиться

От 3,5 вперед можно использовать функцию LINQ для этого:

List<string> l1 = new List<string> {"Hello", "World","How","Are","You"};
List<string> l2 = new List<string> {"Hello","World","How","Are","You"};
Console.WriteLine(l1.SequenceEqual(l2));

Это также знает, что перегрузка обеспечивает Ваш собственный компаратор

24
ответ дан 3 December 2019 в 14:00
поделиться

Что-то вроде этого:

public static bool CompareLists(List<int> l1, List<int> l2)
{
    if (l1 == l2) return true;
    if (l1.Count != l2.Count) return false;
    for (int i=0; i<l1.Count; i++)
        if (l1[i] != l2[i]) return false;
    return true;
}

Некоторая дополнительная проверка ошибок (например, пустые проверки) могла бы требоваться.

1
ответ дан 3 December 2019 в 14:00
поделиться

Принятие Вас означает, что Вы хотите знать, равно ли СОДЕРЖАНИЕ (не только ссылка на объект списка.)

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

Если Вы не выдерживаете сравнение очень часто, я думаю, что это обычно было бы отходами.

0
ответ дан 3 December 2019 в 14:00
поделиться

Что-то вроде этого, возможно, использующее Действие Соответствия.

public static CompareList<T>(IList<T> obj1, IList<T> obj2, Action<T,T> match)
{
   if (obj1.Count != obj2.Count) return false;
   for (int i = 0; i < obj1.Count; i++)
   {
     if (obj2[i] != null && !match(obj1[i], obj2[i]))
       return false;
   }
}
0
ответ дан 3 December 2019 в 14:00
поделиться

Один ярлык, что я не видел упомянул, заключается в том, что если вы знаете, как созданы списки, вы можете присоединиться к ним в строки и сравнить напрямую.

Например ...

В моем случае я хотел подсказать пользователю список слов. Я хотел убедиться, что каждое слово началось с буквы, но после этого он может содержать буквы, цифры или подчеркивания. Я особенно обеспокоен тем, что пользователи будут использовать тире или начать с номеров.

Я использую регулярные выражения, чтобы сломать его на 2 списка, и они присоединяются к ним обратно вместе и сравнивают их как строки:

    var testList = userInput.match(/[-|\w]+/g)  
        /*the above catches common errors: 
         using dash or starting with a numeric*/
    listToUse = userInput.match(/[a-zA-Z]\w*/g)

    if (listToUse.join(" ") != testList.join(" ")) {
                return "the lists don't match"

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

0
ответ дан 3 December 2019 в 14:00
поделиться
Другие вопросы по тегам:

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