Если количество размеров фиксируется, это просто SelectMany
:
var qry = from a in A
from b in B
from c in C
select new {A=a,B=b,C=c};
Однако, если количеством размеров управляют по условию, необходимо использовать рекурсию:
static void Main() {
List<List<int>> outerList = new List<List<int>>
{ new List<int>(){1, 2, 3, 4, 5},
new List<int>(){0, 1},
new List<int>(){6,3},
new List<int>(){1,3,5}
};
int[] result = new int[outerList.Count];
Recurse(result, 0, outerList);
}
static void Recurse<TList>(int[] selected, int index,
IEnumerable<TList> remaining) where TList : IEnumerable<int> {
IEnumerable<int> nextList = remaining.FirstOrDefault();
if (nextList == null) {
StringBuilder sb = new StringBuilder();
foreach (int i in selected) {
sb.Append(i).Append(',');
}
if (sb.Length > 0) sb.Length--;
Console.WriteLine(sb);
} else {
foreach (int i in nextList) {
selected[index] = i;
Recurse(selected, index + 1, remaining.Skip(1));
}
}
}
Одна новая вещь CLR, о которой я знаю, - это форма структурной типизации для интерфейсов, структур и делегатов ради поддержки NoPIA - в основном, это позволяет среде выполнения обрабатывать отдельные типы с эквивалентными определениями, как если бы они были одними и теми же - так, если две сборки A
и B
имеют объявленный в них COM-импортированный интерфейс IFoo
, с одинаковые IID и те же члены, среда выполнения будет рассматривать их как эквивалентные типы; поэтому, если есть экземпляр некоторого класса Foo
, реализующего [A] IFoo
, вы можете преобразовать его в [B] IFoo
, и приведение будет работать.
] Еще одна вещь - возможность разместить несколько версий CLR бок о бок в одном процессе. Например, вы не можете разместить 1.x и 2.0 в одном процессе, но можете разместить 2. 0 и 4.0. Основным преимуществом этого является возможность загружать плагины, написанные для любой версии CLR одновременно.
Еще один незначительный момент заключается в том, что еще несколько исключений стали неуловимыми, например StackOverflowException
было в 2.0 - вы не можете поймать AccessViolationException
, например.
Кроме того, здесь представляет собой презентацию PowerPoint на CLR 4.0 от PDC 2008. Сейчас это может быть немного устаревшим, но большинство вещей, которые упоминаются там, похоже, в бета-версиях.
Я попытался взглянуть на некоторые новые вещи C # в Reflector, чтобы узнать, есть ли что-нибудь новое внизу:
Так что, я думаю, вы не заметите никаких изменений (например, общую поддержку в CLR 2.0).
Я не верю, что есть какие-либо новые инструкции IL. В новой среде CLR улучшены такие вещи, как встраивание и сборка мусора, которые выполняют ту же работу, что и среда CLR 2.0, но лучше. Виртуальная машина (например, CLR или JVM) - это абстрактное понятие с множеством возможных реализаций. Я считаю, что CLR 4.0 - это та же абстрактная машина, что и в CLR 2.0, только с улучшенной реализацией.
Даже новый динамический материал - это просто уловка компилятора с новыми API (в отличие от Java, где он предлагается как новый код операции .)
Если я ошибаюсь, я хотел бы знать!
Есть огромное количество изменений.
В самой CLR есть несколько изменений. Сборщик мусора изменяется для поддержки одновременной сборки gen0 / 1 и gen2 в режиме рабочей станции. Кроме того, есть некоторые изменения в реализации безопасности. Параллельная структура меняет некоторые реализации пула потоков в CLR (который не полностью управляется, но является частью самой среды выполнения). Кроме того, есть некоторые изменения в системе типов, в основном связанные с новой поддержкой PIA COM.
Самыми большими изменениями, вероятно, являются больше изменений библиотеки / фреймворка, чем изменения среды CLR. такие как интеграция DLR в структуру и новый динамический тип. Что касается фреймворка, у вас есть реактивный фреймворк, расширения параллельных библиотек, контракты кода, поддержка кортежей и множество мелких изменений (например:
Для каждого выпуска документации команды создают документы «Что нового».
Вот один для C # 4.0 Beta2: Что нового в Visual C # 2010
А вот один для .NET Framework 4.0 Beta2: Что нового в .NET Framework версии 4
Это наиболее полные списки изменений, которые вы можете найти.
Многие основные типы интерфейсов и делегатов в CLR были обновлены для поддержки общей ковариации и контравариантности . Например, IEnumerable
был изменен на IEnumerable
.