繁体   English   中英

使用LINQ遍历字符串集合

[英]Iterate over a collection of strings using LINQ

我将以下代码段放在.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);   
}

您实际上正在返回集合的集合。

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

对于sequ1中的每个元素,此语句对sequ2进行过滤以从第二个序列中查找所有元素,其中第一个序列中的当前值短于该元素,然后映射到包含每个结果的新集合。

要描述Select实际在做什么:

  • 您从一堆东西开始。 在您的情况下: sequ1类型为IEnumerable<string>
  • 您为其提供了一个函数,此函数接受您为其提供了集合的事物类型的参数,并具有其他某种事物的返回类型(在您的情况下):

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

    您的函数接受一个string并返回IEnumerable<string>

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

因此,您以IEnumerable<string>开始,最后以IEnumerable<IEnumerable<string>>

这意味着您对出现在sequ1中的每个值都有一个集合。

因此,您希望结果为:{{},{“ defgh”,“ ijklm”},{“ defgh”,“ ijklm”},{“ defgh”,“ ijklm”},{“ 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找到相应的元素

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

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。

    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);
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM