2015-10-10 2 views
0

У меня есть список вещей. Есть ли разница между list.Count > 0 и list.Count != 0? Или любая разница в производительности в этих кодах?Разница между списком.Состояние> 0 и list.Count! = 0

if (list.Count > 0) 
    // do some stuff 

if (list.Count != 0) 
    // do some stuff 

Примечание: list.Count не может быть меньше, чем Зиро ..

+3

Если это сделает или нарушит вашу программу, вы в хорошей форме. –

+0

http://stackoverflow.com/a/1030001/4767498 –

+1

@RSahu, no sir .. –

ответ

4

Там нет реально никакой разницы в списке никогда не может иметь меньше чем 0 пунктов, но == для целочисленных сравнений нечестивым быстро , поэтому он, вероятно, быстрее, чем >. Более прохладный подход - list.Any().

(Предполагается, что с помощью списка вы имеете в виду тип List или любой встроенный в IEnumerable/Collection)

+0

tnx, очень хорошо Тимоти ... –

+0

Я, хотя в тех же строках (upvoted), но на самом деле 'list.Any()' кажется медленнее! Проверьте мой ответ ниже: –

+0

Очень интересно! Спасибо @ArghyaC –

3

Есть ли разница между list.Count > 0 и list.Count != 0?

Да. Первый оценивает, является ли list.Count больше, чем 0. Второй оценивает, не равен ли он 0. «Больше, чем» и «не равно» - это разные вещи.

+0

Можно ли предположить, что они означают список, который не должен иметь меньше 0? –

+0

@TimothyStepanski Вы должны спросить OP. Я не делаю такого предположения. – juanchopanza

+0

подсчет списка никогда не меньше нуля, поэтому здесь они одинаковы. –

1

В этом конкретном сценарии нет типичной разницы между этими двумя. но != и >0 совершенно разные. >0 Выполнить только , когда счетчик (условное выражение) больше 0, где в качестве != Выполнить, когда счетчик (условное выражение) больше, чем 0, а также меньше, чем 0

if (list.Count > 0) 
{ 
    // Execute only when the count greater than 0 
} 
if (list.Count != 0) 
{ 
    // Execute only when the count not equal to 0 
} 
+0

Как вы можете это знать? Если у вас есть доступ к коду OP, вы можете сказать нам, на каком языке он написан, и что такое 'list'? – juanchopanza

+1

примечание: list.Count не может быть меньше, чем ziro .. –

+0

Я хорошо. List.Count не будет отрицательным. То, что я пытаюсь сказать в своем втором выражении, - это различие между '> 0' и'! = ' –

0

Я думаю, если ICollection. Count - тип uint, у вас не будет таких вопросов. Узнайте, почему ICollection.Count является int по адресу Why does .NET use int instead of uint in certain classes?.

С точки зрения удобочитаемости, list.Count != 0 вызовет размышления, может ли Count быть отрицательным. Поэтому я предпочитаю list.Count > 0 персональный.

2

Как объяснил всем, функционально нет никакой разницы между list.Count != 0 и list.Count > 0 как list.Count не может быть < 0.

Я сделал быстрый тест, и это показывает, как != 0 и > 0 являются почти одинаково быстро (и это супер быстро). Linq's list.Any() НЕ так быстро!

Вот тестовый код (по сравнению в 100000 раз, чтобы увеличить разницу)

static List<object> GetBigObjectList() 
{ 
    var list = new List<object>(); 
    for (int i = 0; i < 10000; i++) 
    { 
     list.Add(new object()); 
    } 
    return list; 
} 

static void Main(string[] args) 
{ 
    var myList = GetBigObjectList(); 
    var s1 = new Stopwatch(); 
    var s2 = new Stopwatch(); 
    var s3 = new Stopwatch(); 

    s1.Start(); 
    for (int i = 0; i < 100000; i++) 
    { 
     var isNotEqual = myList.Count != 0; 
    } 
    s1.Stop(); 

    s2.Start(); 
    for (int i = 0; i < 100000; i++) 
    { 
     var isGreaterThan = myList.Count > 0; 
    } 
    s2.Stop(); 

    s3.Start(); 
    for (int i = 0; i < 100000; i++) 
    { 
     var isAny = myList.Any(); 
    } 
    s3.Stop(); 

    Console.WriteLine("Time taken by != : " + s1.ElapsedMilliseconds); 
    Console.WriteLine("Time taken by >  : " + s2.ElapsedMilliseconds); 
    Console.WriteLine("Time taken by Any() : " + s3.ElapsedMilliseconds);    
    Console.ReadLine(); 
} 

И это показывает:

Время, затрачиваемое!=: 0
Времени, принятое>: 0
времени, затраченное на любом(): 10

0

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

cmp BL, BH  ; BL and BH are cpu registers 
je EQUAL_Label  ; BL = BH 
jg GREATER_Label  ; BL > BH 
jmp LESS_Label  ; BL < BH 

Как вы можете видеть, je, jg или jmp команды почти самые атомарные команды, которые, вероятно, работают по команде предыдущей cmp (ср). В заключение мы можем сказать, что между этими командами сравнения нет существенной разницы в производительности.
Удача

Смежные вопросы