У меня есть следующий список строк {"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;
    }
}
-3
extra8 21 Авг 2018 в 12:03

4 ответа

Лучший ответ

Вы можете использовать перегрузку Select, которая получает индекс текущего элемента в качестве дополнительного параметра для селектора и использует его следующим образом:

var triplets = sortedStudents.Take(list.Count - 2)
    .Select((x, i) => new { S1 = x, S2 = list[i+1], S3 = list[i+2] });
4
Bill Tür 21 Авг 2018 в 09:18

Просто зациклите строки в вашем массиве:

public IEnumerable<IEnumerable<string>> GetTriples(string[] myArray)
{
    for (int i = 0; i < myArray.Length - 2; i++)
    {
        yield return myArray.Skip(i).Take(3);
    }
}

Этот код зацикливает каждую строку в вашем массиве и получает следующие две строки.

0
HimBromBeere 21 Авг 2018 в 09:15

Предполагая (поскольку у вас нет полного образца кода), что вы хотите взять тройки элементов из вашей коллекции в порядке их появления, вы можете использовать комбинацию Skip и Take для дать вам подмножества, представляющие ваши тройки.

var triplets = new List<IEnumerable<Student>>();

for(int i = 0; i < (sortedStudents.Count - 2); i++)
{
   triplets.Add(sortedStudents.Skip(i).Take(3));
}
0
Paul Turner 21 Авг 2018 в 09:19

Вот один подход с 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));
2
fubo 21 Авг 2018 в 13:14
51945173