我将以下代码段放在.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);
}
答案 0 :(得分:4)
您实际上正在返回一系列馆藏。
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中出现的每个值的集合。
因此,您会期望结果如下: {{},{&#34; defgh&#34;,&#34; ijklm&#34;},{&#34; defgh&#34;,&#34; ijklm&#34;},{&#34; defgh& #34;,&#34; ijklm&#34;},{&#34; defgh&#34;,&#34; ijklm&#34;}}
您可以通过添加另一个循环来检查结果。
foreach(var y in result)
{
foreach(var z in result)
{
Console.WriteLine(z);
}
}
答案 1 :(得分:1)
将您的选择更改为SelectMany:
var result = sequ1.SelectMany(n1 => sequ2.Where(n2 => n1.Length < n2.Length));
答案 2 :(得分:1)
我可能错了,但我认为OP希望比较两个数组,并且对于每个元素,打印最长的数组。
如果是这种情况,我会按如下方式进行:
var result = sequ1.Take(sequ2.Length)
.Select((n1, i) =>
(n1.Length > sequ2.ElementAt(i).Length)
? n1
: sequ2.ElementAt(i));
说明:
使用Take仅与第二个数组的长度一样长,并避免以后出现空引用异常
使用Select,有两个参数,第一个是字符串,第二个是索引
使用ElementAt在sequ2
答案 3 :(得分:0)
我不知道这个例子是否有助于您了解如何选择工作。我认为这是一个更简单的例子。
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);
}
}
答案 4 :(得分:0)
如果您正在开始使用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);
}
}