使用 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);
}
我不知道这个例子是为了帮助你理解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);
}
}
将您的 Select 更改为 Select 许多:
var result = sequ1.SelectMany(n1 => sequ2.Where(n2 => n1.Length < n2.Length));
如果您刚开始使用 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);
}
}
我可能错了,但我认为 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
中找到对应的元素
您实际上是在 return 收集一组集合。
sequ1.Select( n1 => sequ2.Where(n2 => n1.Length < n2.Length) );
对于 sequ1 中的每个元素,此语句过滤 sequ2 以查找第二个序列中第一个序列中的当前值比它短的所有元素,然后映射到包含每个结果的新集合。
描述 Select 实际在做什么:
- 你从一堆东西开始。在您的情况下:
sequ1
类型为 IEnumerable<string>
你给它提供一个函数,这个函数接受你提供给它的东西类型的参数,并且有一个 return 类型的东西,在你的案例:
fun n1 => sequ2.Where(n2 => n1.Length < n2.Length)
你的函数需要一个 string
和 return 一个 IEnumerable<string>
最后,它return是一个包含原始集合中的每个元素的集合的结果,这些元素通过您提供的函数转换为一些新元素。
所以你从 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);
}
}
我将以下代码段放在 .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);
}
我不知道这个例子是为了帮助你理解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);
}
}
将您的 Select 更改为 Select 许多:
var result = sequ1.SelectMany(n1 => sequ2.Where(n2 => n1.Length < n2.Length));
如果您刚开始使用 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);
}
}
我可能错了,但我认为 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
您实际上是在 return 收集一组集合。
sequ1.Select( n1 => sequ2.Where(n2 => n1.Length < n2.Length) );
对于 sequ1 中的每个元素,此语句过滤 sequ2 以查找第二个序列中第一个序列中的当前值比它短的所有元素,然后映射到包含每个结果的新集合。
描述 Select 实际在做什么:
- 你从一堆东西开始。在您的情况下:
sequ1
类型为IEnumerable<string>
你给它提供一个函数,这个函数接受你提供给它的东西类型的参数,并且有一个 return 类型的东西,在你的案例:
fun n1 => sequ2.Where(n2 => n1.Length < n2.Length)
你的函数需要一个
string
和 return 一个IEnumerable<string>
最后,它return是一个包含原始集合中的每个元素的集合的结果,这些元素通过您提供的函数转换为一些新元素。
所以你从 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);
}
}