Какой-то тип прохождения использует:
Spinner mySpinner = (Spinner) findViewById(R.id.cmbClothType);
mySpinner.setAdapter(new ArrayAdapter<MyType>(this, android.R.layout.simple_list_item, MyType.values()));
Как сказал Джейсон, ваш код эквивалентен:
Enumerable.Range(0, 10).Where(n => n % 2 == 0);
Обратите внимание, что лямбда будет преобразована в вызов функции, который выполняется для каждого элемента. Это, вероятно, самая большая часть накладных расходов. Я провел тест, который показывает, что LINQ примерно в 3 раза медленнее (моно gmcs версии 1.2.6.0) именно в этой задаче
Time for 10000000 for loop reps: 00:00:17.6852560 Time for 10000000 LINQ reps: 00:00:59.0574430 Time for 1000000 for loop reps: 00:00:01.7671640 Time for 1000000 LINQ reps: 00:00:05.8868350
РЕДАКТИРОВАТЬ: Gishu сообщает, что VS2008 и framework v3.5 SP1 дают:
Time for 1000000 loop reps: :00.3724585 Time for 1000000 LINQ reps: :00.5119530
LINQ примерно в 1,4 раза там медленнее.
Он сравнивает цикл for и список с LINQ (и с любой структурой, которую он использует внутри). В любом случае он преобразует результат в массив (необходимо, чтобы LINQ перестал быть «ленивым»). Обе версии повторяются:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
public class Evens
{
private static readonly int[] numbers = new int[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
private static int MAX_REPS = 1000000;
public static void Main()
{
Stopwatch watch = new Stopwatch();
watch.Start();
for(int reps = 0; reps < MAX_REPS; reps++)
{
List<int> list = new List<int>(); // This could be optimized with a default size, but we'll skip that.
for(int i = 0; i < numbers.Length; i++)
{
int number = numbers[i];
if(number % 2 == 0)
list.Add(number);
}
int[] evensArray = list.ToArray();
}
watch.Stop();
Console.WriteLine("Time for {0} for loop reps: {1}", MAX_REPS, watch.Elapsed);
watch.Reset();
watch.Start();
for(int reps = 0; reps < MAX_REPS; reps++)
{
var evens = from num in numbers where num % 2 == 0 select num;
int[] evensArray = evens.ToArray();
}
watch.Stop();
Console.WriteLine("Time for {0} LINQ reps: {1}", MAX_REPS, watch.Elapsed);
}
}
Прошлые тесты производительности схожих задач (например, LINQ vs Loop - тест производительности ) подтверждают это.
В приведенном выше коде у вас есть запрос Linq, который выполняет цикл над IEnumerable функционально так же, как цикл foreach. Однако в вашем коде МНОГОЕ происходит под капотом. Foreach, вероятно, намного эффективнее, если вы собираетесь написать высокопроизводительный цикл. Linq предназначен для другой цели (общий доступ к данным).
Интерфейс IEnumerable предоставляет метод итератора, который затем непрерывно вызывается конструкцией цикла, например запросом foreach или Linq. Итератор возвращает следующий элемент в коллекции каждый раз при его вызове.
Вы можете дополнительно упростить код с помощью
var evens = Enumerable.Range(0, 10).Where(n => n % 2 == 0);
. Одно из преимуществ этой формы состоит в том, что выполнение этого выражения откладывается до тех пор, пока не будет повторяться evens
( foreach (var n in evens) {...}
). Вышеупомянутый оператор просто указывает компилятору уловить идею о том, как перечислить четные числа от 0 до 10, но не выполнять эту идею до тех пор, пока это не станет абсолютно необходимым.
LINQ работает иначе для разных типов данных. Вы скармливаете ему объекты, поэтому он использует LINQ-to-objects. Это переводится в код, аналогичный прямому циклу for.
Но LINQ поддерживает разные типы данных. Например, если у вас есть таблица db с именем 'numbers', LINQ-to-SQL преобразует тот же запрос;
var evens = from num in numbers where num % 2 == 0 select num;
в SQL следующим образом;
select num from numbers where num % 2 = 0
, а затем выполняет его. Обратите внимание, что он не выполняет фильтрацию путем создания цикла for с блоком if внутри; "где" Предложение изменяет запрос, отправленный на сервер базы данных. Преобразование запроса в исполняемый код зависит от типа данных, которые вы ему вводите.
Итак, нет, LINQ - это не просто синтаксический сахар для циклов for, а гораздо более сложная система для «компиляции» запросов. Для получения дополнительной информации выполните поиск по запросу Linq Provider
. Это такие компоненты, как linq-to-objects и linq-to-xml, и вы можете написать свои собственные, если чувствуете себя храбрым.