У меня есть следующий список строк {"a", "b", "c", "d", "e"}. Как я могу получить списки длины 3, используя LINQ, как это:
{"a","b","c"}
{"b","c","d"}
{"c","d","e"}
Я не ищу каждую комбинацию
var list = students.OrderBy(student => student.LastName)
.Select(student => student);
List<Student> sortedStudents = list.ToList();
var triplets = from x in sortedStudents
from y in sortedStudents
from z in sortedStudents
select new { x, y, z};
StudentListBox.ItemsSource = triplets;
Я не ищу что-то вроде
{"a","b","c"}
{"a","b","d"}
{"a","b","e"}
.............
{"d","a","b"}
{"d","a","c"}
{"d","a","e"} and so on
Студенческий класс
class Student
{
public Student()
{
}
public String FirstName
{
get;
set;
}
public String LastName
{
get;
set;
}
public DateTime Birthday
{
get;
set;
}
public override string ToString()
{
return FirstName + " " + LastName;
}
}
4 ответа
Вы можете использовать перегрузку Select
, которая получает индекс текущего элемента в качестве дополнительного параметра для селектора и использует его следующим образом:
var triplets = sortedStudents.Take(list.Count - 2)
.Select((x, i) => new { S1 = x, S2 = list[i+1], S3 = list[i+2] });
Просто зациклите строки в вашем массиве:
public IEnumerable<IEnumerable<string>> GetTriples(string[] myArray)
{
for (int i = 0; i < myArray.Length - 2; i++)
{
yield return myArray.Skip(i).Take(3);
}
}
Этот код зацикливает каждую строку в вашем массиве и получает следующие две строки.
Предполагая (поскольку у вас нет полного образца кода), что вы хотите взять тройки элементов из вашей коллекции в порядке их появления, вы можете использовать комбинацию Skip
и Take
для дать вам подмножества, представляющие ваши тройки.
var triplets = new List<IEnumerable<Student>>();
for(int i = 0; i < (sortedStudents.Count - 2); i++)
{
triplets.Add(sortedStudents.Skip(i).Take(3));
}
Вот один подход с Linq - .Take(3)
определяет длину 3
string[] input = { "a", "b", "c", "d", "e" };
var result = Enumerable.Range(0, input.Length - 2).Select(x => input.Skip(x).Take(3));
Похожие вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.