使用LINQ在字符串集合上迭代

本文关键字:迭代 集合 字符串 LINQ 使用 | 更新日期: 2023-09-27 18:20:49

我把下面的代码段放在.NET Fiddle中,但它打印出了System.Linq.Enumerable+WhereArrayIterator1[System.String]。我想打印出结果中的每个内容,以便了解Select是如何工作的。有人能帮忙指出问题出在哪里吗?非常感谢!

string[] sequ1 = { "abcde", "fghi", "jkl", "mnop", "qrs" }; 
string[] sequ2 = { "abc", "defgh", "ijklm", "nop" };
var result =sequ1.Select( n1 => sequ2.Where(n2 => n1.Length < n2.Length) );
foreach( var y in result)
{   
    Console.WriteLine(y);   
}

使用LINQ在字符串集合上迭代

您实际上返回了一个集合集合。

sequ1.Select( n1 => sequ2.Where(n2 => n1.Length < n2.Length) );

对于seq1中的每个元素,该语句过滤seq2,以找到第二序列中第一序列中的当前值比它短的所有元素,然后映射到包含这些结果中的每个结果的新集合。

描述Select的实际操作:

  • 你从一堆东西开始。在您的情况下:类型为IEnumerable<string>sequ1
  • 你给它提供了一个函数,这个函数接受了一个你为它提供的集合的东西类型的参数,并有一个其他东西的返回类型,在你的情况下:

    fun n1 => sequ2.Where(n2 => n1.Length < n2.Length)

    您的函数获取string并返回IEnumerable<string>

  • 最后,它返回一个结果,其中包含原始集合中的每个元素的集合,这些元素由您为其提供的函数转换为某个新元素。

所以你从IEnumerable<string>开始,到IEnumerable<IEnumerable<string>>结束。

也就是说,对于亮片1中出现的每个值,都有一个集合。

因此,您可以预期结果是:{{},{"defgh","ijklm"}

您可以通过添加另一个循环来检查结果。

foreach(var y in result)
{
    foreach(var z in result)
    {
        Console.WriteLine(z);
    }
}

将选择更改为SelectMany:

var result = sequ1.SelectMany(n1 => sequ2.Where(n2 => n1.Length < n2.Length));

我可能错了,但我认为OP希望比较两个数组,并为每个元素打印最长的一个。

如果是这样的话,我会这样做:

var result = sequ1.Take(sequ2.Length)
                  .Select((n1, i) => 
                      (n1.Length > sequ2.ElementAt(i).Length) 
                      ? n1 
                      : sequ2.ElementAt(i));

说明:
使用Take只能达到第二个数组的长度,并避免以后出现nullreference异常。
使用带有两个参数的Select,第一个是字符串,第二个是索引
使用ElementAt在sequ2 中查找相应的元素

我不知道这个例子将帮助您了解选择是如何工作的。我认为这是一个更简单的例子。

public class Person {
        public string Name { get; set; }
        public string LastName { get; set; }
    }
    public class Test {
        public Test() {
            List<Person> persons = new List<Person>();
            persons.Add(new Person() { Name = "Person1",LastName = "LastName1" });
            persons.Add(new Person() { Name = "Person2",LastName = "LastName2" });
            var getNamesFromPersons = persons.Select(p => p.Name);
        }
    }

如果您开始使用c#,您需要在代码中去掉关键字"var"。

强迫自己写出变量的真实含义:

如果你放弃使用var,你就会明白为什么你的代码是Console.Writing。

    string[] sequ1 = { "abcde", "fghi", "jkl", "mnop", "qrs", };
    string[] sequ2 = { "abc", "defgh", "ijklm", "nop", };
    IEnumerable<IEnumerable<string>> result = sequ1.Select(n1 => sequ2.Where(n2 => n1.Length < n2.Length));
    foreach (IEnumerable<string> y in result)
    {
        foreach (string z in y)
        {
            Console.WriteLine(z);
        }
    }