返回LINQ大全首页
目录
Select()
- Select()
- SelectMany()
将序列中的每个元素投影到新表单。 MSDN
在我理解就是将处理过后的数据重新存到新的序列里。
using System.Linq;
using System.Collections;
using System.Collections.Generic;
class Program
{
static void Main( string[] args )
{
int[] numbers = new int[] { 1, 2, 4, 7, 9 };
IEnumerable results = numbers.Select( value => value * 2 );
string text = string.Empty;
foreach( int value in results )
{
text += string.Format( "{0}, ", value );
}
System.Console.WriteLine( text );
System.Console.ReadKey();
}
}
2, 4, 8, 14, 26,
现在我们将目标类序列中的指定数据提取出来重新组成一个新的序列。
using System.Linq;
using System.Collections;
using System.Collections.Generic;
class Program
{
private class Parameter
{
public int ID { get; set; }
public float Rate { get; set; }
public string Name { get; set; }
}
static void Main( string[] args )
{
Parameter[] parameters = new Parameter[]
{
new Parameter() { ID = 5, Rate = 0.0f, Name = "正一郎" },
new Parameter() { ID = 13, Rate = 0.1f, Name = "清次郎" },
new Parameter() { ID = 25, Rate = 0.0f, Name = "誠三郎" },
new Parameter() { ID = 42, Rate = 0.3f, Name = "征史郎" },
};
IEnumerable results = parameters.Select( value => value.Name );
string text = string.Empty;
foreach( string value in results )
{
text += string.Format( "{0}, ", value );
}
System.Console.WriteLine( text );
System.Console.ReadKey();
}
}
正一郎, 清次郎, 誠三郎, 征史郎,
Select()支持返回匿名类型。
using System.Linq;
using System.Collections;
using System.Collections.Generic;
class Program
{
private class Parameter
{
public int ID { get; set; }
public float Rate { get; set; }
public string Name { get; set; }
}
static void Main( string[] args )
{
Parameter[] parameters = new Parameter[]
{
new Parameter() { ID = 5, Rate = 0.0f, Name = "正一郎" },
new Parameter() { ID = 13, Rate = 0.1f, Name = "清次郎" },
new Parameter() { ID = 25, Rate = 0.0f, Name = "誠三郎" },
new Parameter() { ID = 42, Rate = 0.3f, Name = "征史郎" },
};
var results = parameters.Select( value => new { Number = value.ID * 2, Name = value.Name } );
string text = string.Empty;
foreach( var value in results )
{
text += string.Format( "[{0}]:{1}, ", value.Number, value.Name );
}
System.Console.WriteLine( text );
System.Console.ReadKey();
}
}
[10]:正一郎, [26]:清次郎, [50]:誠三郎, [84]:征史郎,
Foreach()
很方便,但是却无法获得索引,而使用for循环又太麻烦,这时候我们也可以使用Select()
实现需求。第二个参数index为索引。
using System.Linq;
using System.Collections;
using System.Collections.Generic;
class Program
{
static void Main( string[] args )
{
string[] names = new string[] { "正一郎", "清次郎", "誠三郎", "征史郎" };
//第二个参数index为索引
var results = names.Select( ( value, index ) => new { Number = index, Name = value } );
string text = string.Empty;
foreach( var value in results )
{
text += string.Format( "[{0}]:{1}, ", value.Number, value.Name );
}
System.Console.WriteLine( text );
System.Console.ReadKey();
}
}
[0]:正一郎, [1]:清次郎, [2]:誠三郎, [3]:征史郎,
SelectMany()
将序列的每个元素投影到 IEnumerable 并将结果序列合并为一个序列。 MSDN
用来对多重嵌套的序列操作很方便。
using System.Linq;
using System.Collections;
using System.Collections.Generic;
class Program
{
private class Parameter
{
public string Name { get; set; }
public int[] Numbers { get; set; }
}
static void Main( string[] args )
{
Parameter[] parameters = new Parameter[]
{
new Parameter() { Name = "正一郎", Numbers = new int[] { 1, 2, 3 } },
new Parameter() { Name = "清次郎", Numbers = new int[] { 1, 3, 5 } },
new Parameter() { Name = "誠三郎", Numbers = new int[] { 2, 4, 6 } },
new Parameter() { Name = "征史郎", Numbers = new int[] { 9, 8, 7 } },
};
IEnumerable results = parameters.SelectMany( value => value.Numbers );
string text = string.Empty;
foreach( int value in results )
{
text += string.Format( "{0}, ", value );
}
System.Console.WriteLine( text );
System.Console.ReadKey();
}
}
1, 2, 3, 1, 3, 5, 2, 4, 6, 9, 8, 7,
重载的多参数方法大致看了一下还没理解,日后再补充。