Убедитесь, что все элементы массива эквивалентны с помощью LINQ?

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

Вот что я придумал:

var e = new IEnumerable [] {
                                    Enumerable.Range(100, 4).ToArray(), 
                                    new int[] { 100, 101, 102, 103 },
                                    new [] { 100, 101, 102, 103 },
                                    Enumerable.Range(100, 4).ToList(), 
                                    new List { 100, 101, 102, 103 }
                                };

var permutations = e.SelectMany(s => e, ( lhs, rhs ) => new { lhs,  rhs })
                    .Where( x => !x.lhs.Equals ( x.rhs ) ); 

foreach (var item in permutations)
{
    Assert.That( item.lhs, Is.EqualTo( item.rhs ) );
}
  • Q1 <р>. Есть ли «простая» модификация для получения 10 комбинаций пар (у меня в настоящее время имеется 20 перестановок пар)? «Простым» я имею в виду использование существующих операторов LINQ, а не, скажем, рекурсивный метод расширения.

  • Q2 <р>. Есть ли лучший способ утверждать, что «все члены массива эквивалентны» в контексте?


Что касается Q1, это, казалось бы, дало бы мне правую часть (rhs), но как «переносить» (или воссоединиться) с «оригиналом», чтобы дать мне левую сторону (lhs) ?:

var r = e.SelectMany(( e1, i ) => e.Skip( i + 1 ));
3
nl ja de
Непонятно, чего вы пытаетесь достичь: просто вы хотите утверждать, что (100,101,102,103) содержит те же элементы, например. (103,102,100,101) ?
добавлено автор Teejay, источник
Кроме того, ваш не является массивом, а в основном матрицей
добавлено автор Teejay, источник
Означает ли порядок? Как следует учитывать дубликаты?
добавлено автор yoozer8, источник

1 ответы

Это будет работать

var leftHandSide = inputSequence.First();
var rightHandSideList = inputSequence.Skip(1);

rightHandSideList.All(s => s.SequenceEqual(leftHandSide));

В основном мы берем 1-й элемент и сравниваем его с этим. Здесь я беру на себя вопросы порядка. Также предполагается, что в списке есть как минимум 2 элемента.

4
добавлено
Согласитесь, это сработает. Но лучше подумайте об именах :)
добавлено автор Sergey Berezovskiy, источник
@Ankush уже поддержал :)
добавлено автор Sergey Berezovskiy, источник
+1 var res = rightHandSideList.All (s => s.OrderBy (_ => _). SequenceEqual (leftHandSide.OrderBy (_ => _))); Чтобы игнорировать заказы в списке.
добавлено автор Adam Houldsworth, источник
@lazyberezovsky обновлено :)
добавлено автор Ankush, источник
Мое мышление было неустойчивым: мне нужно только сравнить первый элемент с каждым последующим элементом! Поэтому мне не нужны перестановки или комбинации в этом сценарии, но я хотел бы знать, как это сделать с моим текущим подходом, поэтому я задам еще один вопрос. Благодаря!
добавлено автор petemoloy, источник
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot