Note
ãã®ããŒãžã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ èŠã§ãã ãµã€ã³ã€ã³ãŸãã¯ãã£ã¬ã¯ããªã®å€æŽã詊ãããšãã§ããŸãã
ãã®ããŒãžã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ èŠã§ãã ãã£ã¬ã¯ããªã®å€æŽã詊ãããšãã§ããŸãã
ã©ã ãåŒã䜿çšããŠå¿å颿°ãäœæããŸãã
ã©ã ãå®£èšæŒç®å=>ã䜿çšããŠãã©ã ãã®ãã©ã¡ãŒã¿ãŒ ãªã¹ããåŒæ¬äœããåé¢ããŸãã
C# èšèªãªãã¡ã¬ã³ã¹ã«ã¯ãC# èšèªã®ææ°ãªãªãŒã¹ ããŒãžã§ã³ãèšèŒãããŠããŸãã ãŸããä»åŸã®èšèªãªãªãŒã¹ã®ãããªã㯠ãã¬ãã¥ãŒã®æ©èœã«é¢ããåæããã¥ã¡ã³ããå«ãŸããŠããŸãã
ãã®ããã¥ã¡ã³ãã§ã¯ãèšèªã®æåŸã® 3 ã€ã®ããŒãžã§ã³ãŸãã¯çŸåšã®ãããªã㯠ãã¬ãã¥ãŒã§æåã«å°å ¥ãããæ©èœãç¹å®ããŸãã
ãã³ã
C# ã§æ©èœãåããŠå°å ¥ãããææã確èªããã«ã¯ã C# èšèªããŒãžã§ã³å±¥æŽã«é¢ããèšäºãåç §ããŠãã ããã
ã©ã ãåŒã«ã¯ã次㮠2 ã€ã®åœ¢åŒã®ãããããæå®ã§ããŸãã
åŒ ã®æ¬äœãšããŠåŒãæã€åŒã©ã ã:
(input-parameters) => expressionæ¬äœãšããŠã¹ããŒãã¡ã³ã ãããã¯ãæã€ã¹ããŒãã¡ã³ã ã©ã ã:
(input-parameters) => { <sequence-of-statements> }
ã©ã ãåŒãäœæããã«ã¯ãã©ã ãæŒç®åã®å·ŠåŽã«å ¥åãã©ã¡ãŒã¿ãŒ (ååšããå Žå) ãæå®ããããäžæ¹ã®åŽã«åŒãŸãã¯ã¹ããŒãã¡ã³ã ãããã¯ãæå®ããŸãã
ä»»æã®ã©ã ãåŒã ããªã²ãŒã åã«å€æã§ããŸãã ã©ã ãåŒã倿ã§ããããªã²ãŒãåã¯ããã®ãã©ã¡ãŒã¿ãŒãšæ»ãå€ã®åã«ãã£ãŠæ±ºãŸããŸãã ã©ã ãåŒãå€ãè¿ããªãå Žåã¯ã Action ããªã²ãŒãåã®ããããã«å€æããŸãã å€ãè¿ãå Žåã¯ã Func ããªã²ãŒãåã®ããããã«å€æããŸãã ããšãã°ã2 ã€ã®ãã©ã¡ãŒã¿ãŒãæã¡ãå€ãè¿ããªãã©ã ãåŒã Action<T1,T2> ããªã²ãŒãã«å€æããŸãã 1 ã€ã®ãã©ã¡ãŒã¿ãŒãæã¡ãå€ãè¿ãã©ã ãåŒã Func<T,TResult> ããªã²ãŒãã«å€æããŸãã æ¬¡ã®äŸã§ã¯ãx => x * x ãšããååã®ãã©ã¡ãŒã¿ãŒãæå®ããx ã®äºä¹ã®å€ãè¿ãã©ã ãåŒ x ããããªã²ãŒãåã®å€æ°ã«å²ãåœãŠãŠããŸãã
Func<int, int> square = x => x * x;
Console.WriteLine(square(5));
// Output:
// 25
次ã®äŸã«ç€ºãããã«ãåŒã©ã ãã åŒããªãŒ åã«å€æããããšãã§ããŸãã
System.Linq.Expressions.Expression<Func<int, int>> e = x => x * x;
Console.WriteLine(e);
// Output:
// x => (x * x)
ããªã²ãŒãåãŸãã¯åŒããªãŒã®ã€ã³ã¹ã¿ã³ã¹ãå¿ èŠãšããä»»æã®ã³ãŒãã§ã©ã ãåŒã䜿çšããŸãã 1 ã€ã®äŸã¯ãããã¯ã°ã©ãŠã³ãã§å®è¡ãããã³ãŒããæž¡ãããã® Task.Run(Action) ã¡ãœãããžã®åŒæ°ã§ãã ãŸããæ¬¡ã®äŸã«ç€ºãããã«ãC# ã§ LINQ ãäœæããå Žåã«ãã©ã ãåŒã䜿çšã§ããŸãã
int[] numbers = { 2, 3, 4, 5 };
var squaredNumbers = numbers.Select(x => x * x);
Console.WriteLine(string.Join(" ", squaredNumbers));
// Output:
// 4 9 16 25
ã¡ãœãã ããŒã¹ã®æ§æã䜿çšã㊠Enumerable.Select ã¯ã©ã¹ (ããšãã°ãLINQ to ObjectsãLINQ to XML ãªã©) ã® System.Linq.Enumerable ã¡ãœãããåŒã³åºããšããã©ã¡ãŒã¿ãŒã¯ããªã²ãŒãå System.Func<T,TResult> ã«ãªããŸãã
Queryable.Select ã¯ã©ã¹ (ããšãã°ãLINQ to SQL ãªã©) ã® System.Linq.Queryable ã¡ãœãããåŒã³åºããšããã©ã¡ãŒã¿ãŒåã¯åŒããªãŒå Expression<Func<TSource,TResult>> ã«ãªããŸãã ã©ã¡ãã®å Žåããåãã©ã ãåŒã䜿çšããŠãã©ã¡ãŒã¿ãŒå€ãæå®ã§ããŸãã ããã«ããã2 ã€ã® Select åŒã³åºãã¯å€èгã䌌ãŠããŸãããã©ã ãããå®éã«äœæããããªããžã§ã¯ãã®åã¯ç°ãªããŸãã
åŒåœ¢åŒã®ã©ã ã
=> æŒç®åã®å³èŸºã«åŒãããã©ã ãåŒã "åŒåœ¢åŒã®ã©ã ã" ãšåŒã³ãŸãã åŒåœ¢åŒã®ã©ã ãã¯åŒã®çµæãè¿ããŸããåºæ¬çãªåœ¢åŒã¯æ¬¡ã®ãšããã§ãã
(input-parameters) => expression
åŒåœ¢åŒã®ã©ã ãã®æ¬äœããã¡ãœããåŒã³åºãã§æ§æã§ããŸãã ãã ããã¯ãšãª ãããã€ããŒãè©äŸ¡ãã åŒããªãŒ ãäœæããå Žåã¯ãã¯ãšãª ãããã€ããŒããã®åœ¢åŒã«å€æããã¡ãœããã®åŒã³åºããå¶éããŸãã ã¯ãšãª ãããã€ããŒã«ãã£ãŠãããŸããŸãªæ©èœããããŸãã ããšãã°ãå€ãã® SQL ããŒã¹ã®ãããã€ããŒã¯ã String.StartsWith ãªã©ã®ã¡ãœãããã LIKEãªã©ã®é©å㪠SQL åŒã«å€æã§ããŸãã ã¯ãšãª ãããã€ããŒãã¡ãœããåŒã³åºããèªèããªãå ŽåãåŒã倿ãŸãã¯å®è¡ããããšã¯ã§ããŸããã
ã¹ããŒãã¡ã³ã圢åŒã®ã©ã ã
ã¹ããŒãã¡ã³ã圢åŒã®ã©ã ãã¯åŒåœ¢åŒã®ã©ã ãã«äŒŒãŠããŸãããã¹ããŒãã¡ã³ããäžãã£ãã§å²ãŸããç¹ãç°ãªããŸãã
(input-parameters) => { <sequence-of-statements> }
ã¹ããŒãã¡ã³ãã©ã ãã®æ¬äœã¯ãä»»æã®æ°ã®ã¹ããŒãã¡ã³ãã§æ§æã§ããŸãã ãã ããå®éã«ã¯ãé垞㯠2 ã€ãŸã㯠3 ã€ä»¥äžã§ãã
Action<string> greet = name =>
{
string greeting = $"Hello {name}!";
Console.WriteLine(greeting);
};
greet("World");
// Output:
// Hello World!
ã¹ããŒãã¡ã³ã圢åŒã®ã©ã ãã䜿çšããŠåŒããªãŒãäœæããããšã¯ã§ããŸããã
ã©ã ãåŒã®å ¥åãã©ã¡ãŒã¿ãŒ
ã©ã ãåŒã®å ¥åãã©ã¡ãŒã¿ãŒããã£ãã§å²ã¿ãŸãã 空ã®ãã£ãã䜿çšããŠã0 åã®å ¥åãã©ã¡ãŒã¿ãŒãæå®ããŸãã
Action line = () => Console.WriteLine();
ã©ã ãåŒã«å ¥åãã©ã¡ãŒã¿ãŒã 1 ã€ãããªãå Žåã¯ããã£ããçç¥ã§ããŸãã
Func<double, double> cube = x => x * x * x;
2 ã€ä»¥äžã®å ¥åãã©ã¡ãŒã¿ãŒãã³ã³ãã§åºåããŸãã
Func<int, int, bool> testForEquality = (x, y) => x == y;
éåžžãã³ã³ãã€ã©ã¯ãæé»çã«åæå®ããããã©ã¡ãŒã¿ãŒ ãªã¹ããšåŒã°ããã©ã ãåŒã«ãã©ã¡ãŒã¿ãŒã® åãæšè«ããŸãã æç€ºçã«åãæå®ã§ããŸããããã¯ã æç€ºçã«åæå®ããããã©ã¡ãŒã¿ãŒ ãªã¹ããšåŒã°ããŸãã æç€ºçã«åæå®ããããã©ã¡ãŒã¿ãŒ ãªã¹ãã®äŸã次ã«ç€ºããŸãã
Func<int, string, bool> isTooLong = (int x, string s) => s.Length > x;
å
¥åãã©ã¡ãŒã¿ãŒã®åã¯ããã¹ãŠæç€ºçãŸãã¯æé»çã§ããå¿
èŠããããŸãã ãã以å€ã®å Žåã¯ã CS0748 ã³ã³ãã€ã© ãšã©ãŒãçºçããŸãã C# 14 ããåã®ããŒãžã§ã³ã§ã¯ã ref ã outãªã©ã®ä¿®é£Ÿåãããå Žåã¯ããã©ã¡ãŒã¿ãŒã«æç€ºçãªåãå«ããå¿
èŠããããŸãã C# 14 ã§ã¯ããã®å¶éã¯åé€ãããŸãã ãã ãã params 修食åã䜿çšããå Žåã¯ãåã宣èšããå¿
èŠããããŸãã
ç Žæ£ã䜿çšããŠãåŒã§äœ¿çšãããŠããªãã©ã ãåŒã® 2 ã€ä»¥äžã®å ¥åãã©ã¡ãŒã¿ãŒãæå®ããŸãã
Func<int, int, int> constant = (_, _) => 42;
ã©ã ãã®ç Žæ£ãã©ã¡ãŒã¿ãŒã¯ãã©ã ãåŒã䜿çšããŠã€ãã³ã ãã³ãã©ãŒæå®ããå Žåã«åœ¹ç«ã€ããšããããŸãã
ã¡ã¢
äžäœäºææ§ã®ããã«ã _ãšããååã®å
¥åãã©ã¡ãŒã¿ãŒã 1 ã€ã ãã®å Žåãã³ã³ãã€ã©ã¯ _ ããã®ã©ã ãåŒå
ã®ãã®ãã©ã¡ãŒã¿ãŒã®ååãšããŠæ±ããŸãã
æç€ºçã«åæå®ããããã©ã¡ãŒã¿ãŒ ãªã¹ãã® æ¢å®å€ ãæå®ã§ããŸãã æ¢å®ã®ãã©ã¡ãŒã¿ãŒå€ã®æ§æãšå¶çŽã¯ãã¡ãœãããšããŒã«ã«é¢æ°ã®å Žåãšåãã§ãã æ¬¡ã®äŸã§ã¯ãæ¢å®ã®ãã©ã¡ãŒã¿ãŒã䜿çšããŠã©ã ãåŒã宣èšããæ¢å®å€ã䜿çšã㊠1 åã2 ã€ã®æç€ºçãªãã©ã¡ãŒã¿ãŒãæå®ã㊠1 ååŒã³åºããŸãã
var IncrementBy = (int source, int increment = 1) => source + increment;
Console.WriteLine(IncrementBy(5)); // 6
Console.WriteLine(IncrementBy(5, 2)); // 7
æç€ºçã«åæå®ããããã©ã¡ãŒã¿ãŒ ãªã¹ãã®æåŸã®ãã©ã¡ãŒã¿ãŒãšããŠã params é
åãŸãã¯ã³ã¬ã¯ã·ã§ã³ã䜿çšããŠã©ã ãåŒã宣èšããããšãã§ããŸãã
var sum = (params IEnumerable<int> values) =>
{
int sum = 0;
foreach (var value in values)
sum += value;
return sum;
};
var empty = sum();
Console.WriteLine(empty); // 0
var sequence = new[] { 1, 2, 3, 4, 5 };
var total = sum(sequence);
Console.WriteLine(total); // 15
ãããã®æŽæ°ã®äžç°ãšããŠãæ¢å®ã®ãã©ã¡ãŒã¿ãŒãäžããããã¡ãœãã ã°ã«ãŒããã©ã ãåŒã«å²ãåœãŠããããšããã®ã©ã ãåŒã«ãåãæ¢å®ã®ãã©ã¡ãŒã¿ãŒãäžããããŸãã
params ã³ã¬ã¯ã·ã§ã³ ãã©ã¡ãŒã¿ãŒãæã€ã¡ãœãã ã°ã«ãŒããã©ã ãåŒã«å²ãåœãŠãããšãã§ããŸãã
ãã©ã¡ãŒã¿ãŒãšããŠæ¢å®ã®ãã©ã¡ãŒã¿ãŒãŸã㯠params ã³ã¬ã¯ã·ã§ã³ã䜿çšããã©ã ãåŒã«ã¯ãFunc<> åãŸã㯠Action<> åã«å¯Ÿå¿ããèªç¶åããããŸããã ãã ããæ¢å®ã®ãã©ã¡ãŒã¿ãŒå€ãå«ãŸããããªã²ãŒãåãå®çŸ©ã§ããŸãã
delegate int IncrementByDelegate(int source, int increment = 1);
delegate int SumDelegate(params int[] values);
delegate int SumCollectionDelegate(params IEnumerable<int> values);
ãããã¯ãæé»çã«åæå®ããã倿°ãš var 宣èšã䜿çšããããªã±ãŒãåãå®çŸ©ã§ããŸãã ã³ã³ãã€ã©ã«ãã£ãŠæ£ããããªã²ãŒãåãåæãããŸãã
ã©ã ãåŒã®æ¢å®ã®ãã©ã¡ãŒã¿ãŒã®è©³çްã«ã€ããŠã¯ãã©ã ãåŒã®æ©èœä»æ§ ã®æ¢å®ã®ãã©ã¡ãŒã¿ãŒã åç §ããŠãã ããã
éåæã©ã ã
async ããŒã¯ãŒããš await ããŒã¯ãŒãã䜿çšãããšãéåæåŠçãçµã¿èŸŒãã ã©ã ãåŒãšã¹ããŒãã¡ã³ããç°¡åã«äœæã§ããŸãã ããšãã°ã次ã®Windows ãã©ãŒã äŸã«ã¯ãéåæã¡ãœãã ExampleMethodAsync ãåŒã³åºããŠåŸ
æ©ããã€ãã³ã ãã³ãã©ãŒãå«ãŸããŠããŸãã
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
button1.Click += button1_Click;
}
private async void button1_Click(object sender, EventArgs e)
{
await ExampleMethodAsync();
textBox1.Text += "\r\nControl returned to Click event handler.\n";
}
private async Task ExampleMethodAsync()
{
// The following line simulates a task-returning asynchronous process.
await Task.Delay(1000);
}
}
éåæã©ã ãã䜿çšããŠãåãã€ãã³ã ãã³ãã©ãŒã远å ã§ããŸãã ãã®ãã³ãã©ãŒã远å ããã«ã¯ã次ã®äŸã«ç€ºãããã«ãã©ã ã ãã©ã¡ãŒã¿ãŒ ãªã¹ãã®åã« async 修食åã远å ããŸãã
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
button1.Click += async (sender, e) =>
{
await ExampleMethodAsync();
textBox1.Text += "\r\nControl returned to Click event handler.\n";
};
}
private async Task ExampleMethodAsync()
{
// The following line simulates a task-returning asynchronous process.
await Task.Delay(1000);
}
}
éåæã¡ãœããã®äœæããã³äœ¿ç𿹿³ã®è©³çްã«ã€ããŠã¯ããAsync ããã³ Await ã䜿çšããéåæããã°ã©ãã³ã°ããåç §ããŠãã ããã
ã©ã ãåŒãšã¿ãã«
C# èšèªã«ã¯ãã¿ãã«ã®ãµããŒããçµã¿èŸŒãŸããŠããŸãã ã¿ãã«ã¯ãã©ã ãåŒãžã®åŒæ°ãšããŠæå®ã§ããã»ããã©ã ãåŒã§è¿ãããšãã§ããŸãã å Žåã«ãã£ãŠã¯ãC# ã³ã³ãã€ã©ã¯åæšè«ã䜿çšããŠã¿ãã«èŠçŽ ã®åãæ±ºå®ããŸãã
ã¿ãã«ãå®çŸ©ããã«ã¯ããã®ã³ã³ããŒãã³ãã®ã³ã³ãåºåããªã¹ãããã£ãã§å²ã¿ãŸãã æ¬¡ã®äŸã§ã¯ã3 ã€ã®ã³ã³ããŒãã³ããæã€ã¿ãã«ã䜿çšããŠãã©ã ãåŒã«é£ç¶ããæ°å€ãæž¡ããŸãããã®ã©ã ãåŒã«ãããåå€ã 2 åã«ãªããä¹ç®ã®çµæãæ ŒçŽãã 3 ã€ã®ã³ã³ããŒãã³ããæã€ã¿ãã«ãè¿ãããŸãã
Func<(int, int, int), (int, int, int)> doubleThem = ns => (2 * ns.Item1, 2 * ns.Item2, 2 * ns.Item3);
var numbers = (2, 3, 4);
var doubledNumbers = doubleThem(numbers);
Console.WriteLine($"The set {numbers} doubled: {doubledNumbers}");
// Output:
// The set (2, 3, 4) doubled: (4, 6, 8)
éåžžãã¿ãã«ã®ãã£ãŒã«ãå㯠Item1ãItem2 ãªã©ã®ããã«ãªããŸãã ãã ããæ¬¡ã®äŸã®ãšãããååä»ãã®ã³ã³ããŒãã³ããæã€ã¿ãã«ãå®çŸ©ããããšãã§ããŸãã
Func<(int n1, int n2, int n3), (int, int, int)> doubleThem = ns => (2 * ns.n1, 2 * ns.n2, 2 * ns.n3);
var numbers = (2, 3, 4);
var doubledNumbers = doubleThem(numbers);
Console.WriteLine($"The set {numbers} doubled: {doubledNumbers}");
C# ã®ã¿ãã«ã®è©³çްã«ã€ããŠã¯ãã¿ãã«åã«é¢ããããŒãžãåç §ããŠãã ããã
æšæºã¯ãšãªæŒç®åã䜿çšããã©ã ã
LINQ to Objects ã¯ãä»ã®å®è£
ã®äžã§ãããžã§ããªã㯠ããªã²ãŒãã® Func<TResult> ãã¡ããªã® 1 ã€ã§ããåã®å
¥åãã©ã¡ãŒã¿ãŒã䜿çšããŸãã ãããã®ããªã²ãŒãã¯ãåãã©ã¡ãŒã¿ãŒã䜿çšããŠãå
¥åãã©ã¡ãŒã¿ãŒã®æ°ãšåã«å ããããªã²ãŒãã®æ»ãå€ã®åãå®çŸ©ããŸãã
Func ããªã²ãŒãã¯ãäžé£ã®ãœãŒã¹ ããŒã¿å
ã®åèŠçŽ ã«é©çšããããŠãŒã¶ãŒå®çŸ©åŒãã«ãã»ã«åããã®ã«åœ¹ç«ã¡ãŸãã ããšãã°ãFunc<T,TResult>ããªã²ãŒãåãèããŠã¿ãŸãããã
public delegate TResult Func<in T, out TResult>(T arg)
Func<int, bool>ãå
¥åãã©ã¡ãŒã¿ãŒã§ãããintãæ»ãå€ã§ããbool ã€ã³ã¹ã¿ã³ã¹ãšããŠããªã²ãŒããã€ã³ã¹ã¿ã³ã¹åããŸãã æ»ãå€ã¯å¿
ãæåŸã®åãã©ã¡ãŒã¿ãŒã§æå®ãããŸãã ããšãã°ãFunc<int, string, bool> 㯠2 ã€ã®å
¥åãã©ã¡ãŒã¿ãŒ ( int ãš string) ãšæ»ãå€ã®å bool ãæã€ããªã²ãŒããå®çŸ©ããŠããŸãã æ¬¡ã® Func ããªã²ãŒãã¯ãåŒã³åºããããšãå
¥åãã©ã¡ãŒã¿ãŒã 5 ã«çãããã©ããã瀺ãããŒã«å€ãè¿ããŸãã
Func<int, bool> equalsFive = x => x == 5;
bool result = equalsFive(4);
Console.WriteLine(result); // False
åŒæ°ã®åã Expression<TDelegate>ã®å Žå (ããšãã°ã Queryable åãå®çŸ©ããæšæºã¯ãšãªæŒç®åãªã©) ã«ã©ã ãåŒãæå®ããããšãã§ããŸãã Expression<TDelegate> åŒæ°ãæå®ãããšãã©ã ãã¯åŒããªãŒã«ã³ã³ãã€ã«ãããŸãã
次ã®äŸã§ã¯ãCount æšæºã¯ãšãªæŒç®åã䜿çšããŸãã
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
int oddNumbers = numbers.Count(n => n % 2 == 1);
Console.WriteLine($"There are {oddNumbers} odd numbers in {string.Join(" ", numbers)}");
ã³ã³ãã€ã©ã¯ãå
¥åãã©ã¡ãŒã¿ãŒã®åãæšè«ããããšããæç€ºçã«æå®ããããšãã§ããŸãã ãã®ç¹å®ã®ã©ã ãåŒã¯ã2 ã§é€ç®ãããšãã«å°äœã 1 ã«ãªãæŽæ° (n) ãã«ãŠã³ãããŸãã
次ã®äŸã§ã¯ãnumbers é
åå
ã§ 9 ããåã«ããèŠçŽ ããã¹ãŠå«ãã·ãŒã±ã³ã¹ãäœæããŸããããã¯ã9 ãã·ãŒã±ã³ã¹å
ã§æ¡ä»¶ãæºãããªãæåã®æ°å€ã§ããããã§ãã
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
var firstNumbersLessThanSix = numbers.TakeWhile(n => n < 6);
Console.WriteLine(string.Join(" ", firstNumbersLessThanSix));
// Output:
// 5 4 1 3
次ã®äŸã§ã¯ãè€æ°ã®å
¥åãã©ã¡ãŒã¿ãŒããã£ãã§å²ãã§æå®ããŸãã ãã®ã¡ãœããã¯ãå€ã numbers é
åå
ã®ãã®äœçœ®ã衚ãåºæ°ãããå°ããæ°å€ãåºçŸãããŸã§ããã®é
åã«å«ãŸãããã¹ãŠã®èŠçŽ ãè¿ããŸãã
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
var firstSmallNumbers = numbers.TakeWhile((n, index) => n >= index);
Console.WriteLine(string.Join(" ", firstSmallNumbers));
// Output:
// 5 4
ã©ã ãåŒãã¯ãšãªåŒã§çŽæ¥äœ¿çšããããšã¯ãããŸããããæ¬¡ã®äŸã«ç€ºãããã«ãã¯ãšãªåŒå ã®ã¡ãœããåŒã³åºãã§ãããã䜿çšã§ããŸãã
var numberSets = new List<int[]>
{
new[] { 1, 2, 3, 4, 5 },
new[] { 0, 0, 0 },
new[] { 9, 8 },
new[] { 1, 0, 1, 0, 1, 0, 1, 0 }
};
var setsWithManyPositives =
from numberSet in numberSets
where numberSet.Count(n => n > 0) > 3
select numberSet;
foreach (var numberSet in setsWithManyPositives)
{
Console.WriteLine(string.Join(" ", numberSet));
}
// Output:
// 1 2 3 4 5
// 1 0 1 0 1 0 1 0
ã©ã ãåŒã®åã®æšå®
ã©ã ããèšè¿°ããå Žåãå€ãã®å Žåãå
¥åãã©ã¡ãŒã¿ãŒã®åãæå®ããå¿
èŠã¯ãããŸããã ã³ã³ãã€ã©ã¯ãã©ã ãæ¬äœããã©ã¡ãŒã¿ãŒåãããã³ C# èšèªä»æ§ã§èª¬æãããŠãããã®ä»ã®èŠå ã«åºã¥ããŠåãæšè«ããŸãã ã»ãšãã©ã®æšæºã¯ãšãªæŒç®åã§ã¯ãæåã®å
¥åããœãŒã¹ ã·ãŒã±ã³ã¹å
ã®èŠçŽ ã®åã§ãã
IEnumerable<Customer>ã«å¯ŸããŠã¯ãšãªãå®è¡ããå Žåãå
¥å倿°ã¯ Customer ãªããžã§ã¯ãã§ãããšæšè«ãããŸããã€ãŸãããã®ã¡ãœãããšããããã£ã«ã¢ã¯ã»ã¹ã§ããŸãã
customers.Where(c => c.City == "London");
ã©ã ãã®åæšè«ã®äžè¬çãªèŠåã¯æ¬¡ã®ãšããã§ãã
- ã©ã ãã«ã¯ããªã²ãŒãåãšåãæ°ã®ãã©ã¡ãŒã¿ãŒãå«ãŸããŠããªããã°ãªããŸããã
- ã©ã ãã«å«ãŸããåå ¥åãã©ã¡ãŒã¿ãŒã¯ã察å¿ããããªã²ãŒã ãã©ã¡ãŒã¿ãŒã«æé»çã«å€æã§ããªããã°ãªããŸããã
- ã©ã ãã®æ»ãå€ (ããå Žå) ã¯ãããªã²ãŒãã®æ»ãå€ã®åã«æé»çã«å€æã§ããªããã°ãªããŸããã
ã©ã ãåŒã®èªç¶å
äžè¬çãªåã·ã¹ãã ã«ã¯ "ã©ã ãåŒ" ãšããçµã¿èŸŒã¿ã®æŠå¿µããªããããã©ã ãåŒã«ã¯åããããŸããããã ããã©ã ãåŒã® "å" ãéå ¬åŒã«è©±ããšäŸ¿å©ãªå ŽåããããŸãã ãã®ãããªå€åç㪠"å" ã¯ãã©ã ãåŒã®å€æåŸã®ããªã²ãŒãåãŸã㯠Expression åãæããŸãã
ã©ã ãåŒã«ã¯ãèªç¶åãæå®ã§ããŸãã ã©ã ãåŒã® Func<...> ã Action<...> ãªã©ã®ããªã²ãŒãåã宣èšãã代ããã«ãã³ã³ãã€ã©ã¯ã©ã ãåŒããããªã²ãŒãåãæšè«ããŸãã ããšãã°ã次ã®ãããªå®£èšããããšããŸãã
var parse = (string s) => int.Parse(s);
ã³ã³ãã€ã©ã¯ã parse ã Func<string, int>ã§ãããšæšè«ããŸãã é©åãªãã®ãååšããå Žåãã³ã³ãã€ã©ã«ã¯ Func ãŸã㯠Action ã®ããªã²ãŒããéžæãããŸãã ãã以å€ã®å Žåã¯ãããªã²ãŒãåãåæãããŸãã ããšãã°ãã©ã ãåŒã®ãã©ã¡ãŒã¿ãŒã ref ã®å Žåãããªã²ãŒãåãåæãããŸãã ã©ã ãåŒã«èªç¶ãªåãããå Žåã¯ã System.Object ã System.Delegateãªã©ãæç€ºçã§ãªãåã«å²ãåœãŠãããšãã§ããŸãã
object parse = (string s) => int.Parse(s); // Func<string, int>
Delegate parse = (string s) => int.Parse(s); // Func<string, int>
æ£ç¢ºã« 1 ã€ã®ãªãŒããŒããŒããæã€ã¡ãœãã ã°ã«ãŒã (ã€ãŸãããã©ã¡ãŒã¿ãŒ ãªã¹ãã®ãªãã¡ãœããå) ã¯ãèªç¶åãæã¡ãŸãã
var read = Console.Read; // Just one overload; Func<int> inferred
var write = Console.Write; // ERROR: Multiple overloads, can't choose
ã©ã ãåŒã System.Linq.Expressions.LambdaExpression ãŸã㯠System.Linq.Expressions.Expression ã«å²ãåœãŠããã®ã©ã ããèªç¶ããªã²ãŒãåãæã€å Žåããã®åŒã®èªç¶å㯠System.Linq.Expressions.Expression<TDelegate> ã§ãããèªç¶ããªã²ãŒãåãåãã©ã¡ãŒã¿ãŒã®åŒæ°ãšããŠäœ¿ãããŸãã
LambdaExpression parseExpr = (string s) => int.Parse(s); // Expression<Func<string, int>>
Expression parseExpr = (string s) => int.Parse(s); // Expression<Func<string, int>>
ãã¹ãŠã®ã©ã ãåŒãèªç¶åãæã€ããã§ã¯ãããŸããã æ¬¡ã®å®£èšãæ€èšããŸãã
var parse = s => int.Parse(s); // ERROR: Not enough type info in the lambda
ã³ã³ãã€ã©ã«ãã£ãŠ s ã®ãã©ã¡ãŒã¿ãŒåãæšè«ããããšã¯ã§ããŸããã ã³ã³ãã€ã©ã«ãã£ãŠèªç¶åãæšè«ã§ããªãå Žåã¯ãåã宣èšããå¿
èŠããããŸãã
Func<string, int> parse = s => int.Parse(s);
æç€ºçãªæ»ãå€ã®å
éåžžãã©ã ãåŒã®æ»ãå€ã®åã¯æããã§ãããæšè«ãããŸãã äžéšã®åŒã§ã¯ããã®æšè«ã¯æ©èœããŸããã
var choose = (bool b) => b ? 1 : "two"; // ERROR: Can't infer return type
ã©ã ãåŒã®æ»ãå€ã®åãå ¥åãã©ã¡ãŒã¿ãŒã®åã«æå®ããããšãã§ããŸãã æç€ºçãªæ»ãå€ã®åãæå®ããå Žåã¯ãå ¥åãã©ã¡ãŒã¿ãŒããã£ãã§å²ãå¿ èŠããããŸãã
var choose = object (bool b) => b ? 1 : "two"; // Func<bool, object>
屿§
ã©ã ãåŒãšãã®ãã©ã¡ãŒã¿ã«å±æ§ã远å ã§ããŸãã æ¬¡ã®äŸã¯ãã©ã ãåŒã«å±æ§ã远å ããæ¹æ³ã瀺ããŠããŸãã
Func<string?, int?> parse = [ProvidesNullCheck] (s) => (s is not null) ? int.Parse(s) : null;
次ã®äŸã«ç€ºãããã«ãå ¥åãã©ã¡ãŒã¿ãŒãŸãã¯æ»ãå€ã«å±æ§ã远å ããããšãã§ããŸãã
var concat = ([DisallowNull] string a, [DisallowNull] string b) => a + b;
var inc = [return: NotNullIfNotNull(nameof(s))] (int? s) => s.HasValue ? s++ : null;
åã®äŸã«ç€ºããšãããã©ã ãåŒãŸãã¯ãã®ãã©ã¡ãŒã¿ãŒã«å±æ§ã远å ããå Žåã¯ãå ¥åãã©ã¡ãŒã¿ãŒããã£ãã§å²ãå¿ èŠããããŸãã
éèŠ
åºã«ãªãããªã²ãŒãåã䜿çšããŠã©ã ãåŒãåŒã³åºããŸãã ãã®åŒã³åºãã¯ãã¡ãœãããããŒã«ã«é¢æ°ãšã¯ç°ãªããŸãã ããªã²ãŒãã® Invoke ã¡ãœããã«ãã£ãŠã©ã ãåŒã®å±æ§ã確èªãããããšã¯ãããŸããã 屿§ã¯ãã©ã ãåŒãåŒã³åºããããšãã«äœã®åœ±é¿ãåãŒããŸããã ã©ã ãåŒã®å±æ§ã¯ã³ãŒãåæã«åœ¹ç«ã¡ããªãã¬ã¯ã·ã§ã³ãä»ããŠæ€åºããããšãã§ããŸãã ãã®æ±ºå®ã®çµæã® 1 ã€ã¯ã System.Diagnostics.ConditionalAttribute ãã©ã ãåŒã«é©çšã§ããªãããšã§ãã
ã©ã ãåŒã«ãããå€éšå€æ°ã®ãã£ããã£ãšå€æ°ã®ã¹ã³ãŒã
ã©ã ãã§ã¯ "å€éšå€æ°" ãåç §ã§ããŸãã ãããã® "å€éšå€æ°" ã¯ããã®ã©ã ãåŒãå®çŸ©ããŠããã¡ãœããã®ã¹ã³ãŒãå ã«ãã倿°ããŸãã¯ãã®ã©ã ãåŒãå«ãåã®ã¹ã³ãŒãå ã«ãã倿°ã§ãã ãã®æ¹æ³ã§å€æ°ããã£ããã£ãããšãã©ã ãåŒã¯ã倿°ãã¹ã³ãŒãå€ã«ãªããéåžžã¯ã¬ããŒãž ã³ã¬ã¯ã·ã§ã³ãããå Žåã§ãã䜿çšããããã«å€æ°ãæ ŒçŽããŸãã ã©ã ãåŒã§äœ¿çšããåã«ãå€éšå€æ°ã確å®ã«å²ãåœãŠãå¿ èŠããããŸãã æ¬¡ã®äŸã¯ãããããèŠåã瀺ããŠããŸãã
public static class VariableScopeWithLambdas
{
public class VariableCaptureGame
{
internal Action<int>? updateCapturedLocalVariable;
internal Func<int, bool>? isEqualToCapturedLocalVariable;
public void Run(int input)
{
int j = 0;
updateCapturedLocalVariable = x =>
{
j = x;
bool result = j > input;
Console.WriteLine($"{j} is greater than {input}: {result}");
};
isEqualToCapturedLocalVariable = x => x == j;
Console.WriteLine($"Local variable before lambda invocation: {j}");
updateCapturedLocalVariable(10);
Console.WriteLine($"Local variable after lambda invocation: {j}");
}
}
public static void Main()
{
var game = new VariableCaptureGame();
int gameInput = 5;
game.Run(gameInput);
int jTry = 10;
bool result = game.isEqualToCapturedLocalVariable!(jTry);
Console.WriteLine($"Captured local variable is equal to {jTry}: {result}");
int anotherJ = 3;
game.updateCapturedLocalVariable!(anotherJ);
bool equalToAnother = game.isEqualToCapturedLocalVariable(anotherJ);
Console.WriteLine($"Another lambda observes a new value of captured variable: {equalToAnother}");
}
// Output:
// Local variable before lambda invocation: 0
// 10 is greater than 5: True
// Local variable after lambda invocation: 10
// Captured local variable is equal to 10: True
// 3 is greater than 5: False
// Another lambda observes a new value of captured variable: True
}
ã©ã ãåŒã«ããã倿°ã®ã¹ã³ãŒãã«ã¯ã次ã®èŠåãé©çšãããŸãã
- ãã£ããã£ãã倿°ã¯ããããåç §ããããªã²ãŒããã¬ããŒãž ã³ã¬ã¯ã·ã§ã³ã®å¯Ÿè±¡ã«ãªããŸã§ã¬ããŒãž ã³ã¬ã¯ã·ã§ã³ãããŸããã
- ã©ã ãåŒå ã§å°å ¥ãã倿°ã¯ãå€åŽã®ã¡ãœããã§ã¯è¡šç€ºãããŸããã
- ã©ã ãåŒã¯ãå€åŽã®ã¡ãœãããã inãrefããŸã㯠out ãã©ã¡ãŒã¿ãŒãçŽæ¥åã蟌ãããšã¯ã§ããŸããã
- ã©ã ãåŒã«å«ãŸãã return ã¹ããŒãã¡ã³ãã§å€åŽã®ã¡ãœãããæ»ãããšã¯ãããŸããã
- ã©ã ãåŒã«ã¯ããžã£ã³ã ã¹ããŒãã¡ã³ãã®ã¿ãŒã²ãããã©ã ãåŒãããã¯ã®å€ã«ããå ŽåãgotoãbreakããŸã㯠continue ã¹ããŒãã¡ã³ããå«ããããšã¯ã§ããŸããã ãŸãããžã£ã³ãå ããããã¯ã®å éšã«ããå Žåã«ãã©ã ãåŒãããã¯ã®å€éšã§ãžã£ã³ã ã¹ããŒãã¡ã³ãã䜿çšãããšãšã©ãŒã«ãªããŸãã
ã©ã ãã«ãã£ãŠããŒã«ã«å€æ°ãŸãã¯ã€ã³ã¹ã¿ã³ã¹ã®ç¶æ
ãæå³ãããã£ããã£ãããªãããã«ããã«ã¯ãã©ã ãåŒã« static 修食åãé©çšããŸãã
Func<double, double> square = static x => x * x;
éçã©ã ãã¯ãå€åŽã®ã¹ã³ãŒãããããŒã«ã«å€æ°ãŸãã¯ã€ã³ã¹ã¿ã³ã¹ã®ç¶æ ããã£ããã£ããããšã¯ã§ããŸããããéçã¡ã³ããŒãšå®æ°å®çŸ©ãåç §ã§ããŸãã
C# èšèªä»æ§
詳现ã«ã€ããŠã¯ããC# èšèªä»æ§ãã®ç¡å颿°ã®åŒã«é¢ããã»ã¯ã·ã§ã³ãåç §ããŠãã ããã