【问题标题】:Extract overlapping substrings from a list of strings using LINQ使用 LINQ 从字符串列表中提取重叠子字符串
【发布时间】:2024-05-01 09:35:02
【问题描述】:

我有以下字符串列表 {"a","b","c","d","e"}。如何使用 LINQ 获取长度为 3 的子列表,如下所示:

{"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;
    }
}

【问题讨论】:

  • 除了这篇文章之外你还有什么努力吗??
  • 你已经尝试了什么?我们没有做你应该做的事情,而是思考
  • 我已经尝试了很多东西,但那些有效的,产生了所有的组合。用一些上下文代码和我的最后一次尝试更新了帖子
  • 能否在代码中包含students 的定义?
  • 当你说“我不是在寻找每一种组合”时,你到底是什么意思?

标签: c# .net list linq


【解决方案1】:

您可以使用Select 的重载,它获取当前元素的索引作为选择器的额外参数,并像这样使用它:

var triplets = sortedStudents.Take(list.Count - 2)
    .Select((x, i) => new { S1 = x, S2 = list[i+1], S3 = list[i+2] });

【讨论】:

  • 感谢您的帮助。我在想出一种基于起点的分组方式时遇到了问题,而这正是我所需要的。
【解决方案2】:

这是使用 Linq 的一种方法 - .Take(3)defines 长度为 3

string[] input = { "a", "b", "c", "d", "e" };
var result = Enumerable.Range(0, input.Length - 2).Select(x => input.Skip(x).Take(3));

【讨论】:

    【解决方案3】:

    只需循环数组中的字符串:

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

    此代码循环您数组中的每个字符串并获取接下来的两个字符串。

    【讨论】:

      【解决方案4】:

      假设(因为您没有完整的代码示例)您想按照它们出现的顺序从您的集合中取出三倍的项目,您可以使用SkipTake 的组合来给出你的子集代表你的三元组。

      var triplets = new List<IEnumerable<Student>>();
      
      for(int i = 0; i < (sortedStudents.Count - 2); i++)
      {
         triplets.Add(sortedStudents.Skip(i).Take(3));
      }
      

      【讨论】: