ããããã³ã¼ãã£ã³ã°ãã¿ã¼ã³ã¨ LINQ to Objects ã®å¯¾å¿ä»ã
ããã¨ä¾¿å©ã§ããããã¨ãããã¨ã§æ¸ãã¦ã¿ãã
ããããã³ã¼ãã£ã³ã°ãã¿ã¼ã³ã«ã¯ yield ã¨ã使ã£ã¦ãªãã§ãã
ãã£ã¡ã®æ¹ãããããããã§ããï¼
Select
å ¨ã¦ã®è¦ç´ ã«ä½ããã®å¦çãè¡ãããã¨ãã«ä½¿ç¨ãã¾ãã
// ããããã³ã¼ãã£ã³ã°ãã¿ã¼ã³ãã®1 // å ¨ã¦ã®è¦ç´ ã2åããã¡ã½ãã public IEnumerable<int> DoubleAll(int[] target) { var result = new int[target.Length]; for (int i = 0; i < target.Length; i++) { result[i] = target[i] * 2; } return result; }
// Selectã§æ¸ãç´ã public IEnumerable<int> DoubleAll(IEnumerable<int> target) { return target.Select(n => n * 2); }
ãã®ããã«ãä¸è¡ã«ãªãã¾ãããå ´åã«ãã£ã¦ã¯ã¡ã½ããåããå¿ è¦ããªãã§ãããã
// ããããã³ã¼ãã£ã³ã°ãã¿ã¼ã³ãã®2 // ã¤ã³ããã¯ã¹ãå¶æ°ã®è¦ç´ ã®ã¿2åããã¡ã½ãã public IEnumerable<int> DoubleIfEvenIndex(int[] target) { var result = new int[target.Length]; for (int i = 0; i < target.Length; i++) { if (i % 2 == 0) { result[i] = target[i] * 2; } else { result[i] = target[i]; } } return result; }
// Selectã§æ¸ãç´ã public IEnumerable<int> DoubleIfEvenIndex(IEnumerable<int> target) { return target.Select((n, i) => i % 2 == 0 ? n * 2 : n); }
2 è¡ï¼
ãããããã¿ã¼ã³ã ãã©ãç´°é¨ãå¾®å¦ã«éãã®ã§ãã¡ãã¡ã«åããããªã³ã¼ãããããã¨ããç¶æ³ãèãã¦ã¿ã¦ãã ããã
ä¾ãã°ãå
¨ã¦ã®è¦ç´ ã« 100 ãå ãããã ã¨ããå
¨ã¦ã®è¦ç´ ãæåååãããã¨ãã£ãå¦çããã£ãå ´åã§ãã
// LINQã使ããªãå ´åãããªã¡ã½ãããå®ç¾©ã»ã»ã» // ã¡ã½ããããä½ããããã®å ´ã«æ¸ãã¦ãããã¨ããã°ãã°ã»ã»ã» public IEnumerable<int> Plus10(int[] target) { var result = new int[target.Length]; for (int i = 0; i < target.Length; i++) { result[i] = target[i] + 100; } return result; } // ä¸ã¨ã»ã¨ãã©åããªãã ãã©ã»ã»ã» public IEnumerable<string> ToStrAll(int[] target) { var result = new string[target.Length]; for (int i = 0; i < target.Length; i++) { result[i] = target[i].ToString(); } return result; }
// LINQã®å ´åãä¸è¡ãªã®ã§ãã®å ´ã«æ¸ãã¦ãã£ã¦ãããã»ã©åé¡ã§ã¯ãªã var hoge = piyo.Select(n => n + 100); // ç¥ var foo = bar.Select(n => n.ToString());
Where
è¦ç´ ãä½ããã®æ¡ä»¶ã§ãã£ã«ã¿ãªã³ã°ãããå ´åã«ä½¿ç¨ãã¾ãã
// ããããã³ã¼ãã£ã³ã°ãã¿ã¼ã³ãã®3 // 奿°ããã£ã«ã¿ãªã³ã°(å¶æ°ã®ã¿ã«ãã) public IEnumerable<int> FilterOdd(IEnumerable<int> target) { var result = new List<int>(); foreach (var n in target) { if (n % 2 == 0) { result.Add(n); } } return result; }
// Whereã§æ¸ãç´ã public IEnumerable<int> FilterOdd(IEnumerable<int> target) { return target.Where(n => n % 2 == 0); }
ããã¾ã 1 è¡ï¼
// ããããã³ã¼ãã£ã³ã°ãã¿ã¼ã³ãã®4 // ã¤ã³ããã¯ã¹ãå¶æ°ã®è¦ç´ ã®ã¿ãã£ã«ã¿ãªã³ã° public IEnumerable<int> FilterOddIndexElem(int[] target) { var result = new List<int>(); for (int i = 0; i < target.Length; i++) // target.Lengthãresult.Countã«ãã¦ãã¾ã£ãã { var n = target[i]; if (i % 2 == 0) // iãnã«ãã¦ãã¾ã£ãã { result.Add(n); // nãiã«ãã¦ãã¾ãã¨ãããã°ãåãè¾¼ã¿ããã»ã»ã» } } return result; }
// Whereã§æ¸ãç´ã public IEnumerable<int> FilterOddIndexElem(IEnumerable<int> target) { return target.Where((_, i) => i % 2 == 0); }
1 è¡ï¼
All
å ¨ã¦ã®è¦ç´ ãããæ¡ä»¶ãæºãããã©ããã調ã¹ãã¨ãã«ä½¿ãã¾ãã
// ããããã³ã¼ãã£ã³ã°ãã¿ã¼ã³ãã®5 // å ¨ã¦ã®è¦ç´ ã.txtã§çµãããã©ãã調ã¹ã public bool EndsWithTxtAll(IEnumerable<string> target) { foreach (var s in target) { if (s.EndsWith(".txt") == false) { return false; } } return true; }
// Allã§æ¸ãç´ã public bool EndsWithTxtAll(IEnumerable<string> target) { return target.All(s => s.EndsWith(".txt")); }
Any
ããããã®è¦ç´ ãããæ¡ä»¶ãæºãããã©ããã調ã¹ãã¨ãã«ä½¿ãã¾ãã
// ããããã³ã¼ãã£ã³ã°ãã¿ã¼ã³ãã®6 // .txtã§çµããè¦ç´ ãä¸ã¤ã§ããããã©ãã調ã¹ã public bool ExistsTxtSuffix(IEnumerable<string> target) { foreach (var s in target) { if (s.EndsWith(".txt")) { return true; } } return false; }
// Anyã§æ¸ãç´ã public bool ExistsTxtSuffix(IEnumerable<string> target) { return target.Any(s => s.EndsWith(".txt")); }
Contains
ããè¦ç´ ãå«ããã©ãã調ã¹ãã¨ãã«ä½¿ãã¾ãã
// ããããã³ã¼ãã£ã³ã°ãã¿ã¼ã³ãã®7 // "hoge"ãå«ã¾ãããã©ãã調ã¹ã public bool ContainsHoge(IEnumerable<string> target) { foreach (var s in target) { if (s == "hoge") { return true; } } return false; }
// Anyã使ã£ã¦æ¸ãç´ã public bool ContainsHoge(IEnumerable<string> target) { return target.Any(s => s == "hoge"); }
// Containsã使ã£ã¦æ¸ãç´ã public bool ContainsHoge(IEnumerable<string> target) { return target.Contains("hoge"); }
Any ã®ç¹æ®ãã¼ã¸ã§ã³ã§ããã
Count
ããæ¡ä»¶ãæºããè¦ç´ ã®åæ°ã調ã¹ãã¨ãã«ä½¿ãã¾ãã
// ããããã³ã¼ãã£ã³ã°ãã¿ã¼ã³ãã®8 // å¶æ°ã®è¦ç´ ã®åæ°ã調ã¹ã public int CountEven(IEnumerable<int> target) { var result = 0; foreach (var n in target) { if (n % 2 == 0) { result++; } } return result; }
// Countã使ã£ã¦æ¸ãç´ã public int CountEven(IEnumerable<int> target) { return target.Count(n => n % 2 == 0); }
Skip
å é ãã n åç¡è¦ãããå ´åã«ä½¿ãã¾ãã
// ããããã³ã¼ãã£ã³ã°ãã¿ã¼ã³ãã®9 // å é 10è¦ç´ ãæ¨ã¦ã public IEnumerable<int> Drop10(int[] target) { var result = new List<int>(); for (int i = 10; i < target.Length; i++) { result.Add(target[i]); } return result; }
public IEnumerable<int> Drop10(IEnumerable<int> target) { return target.Skip(10); }
SkipWhile
å é ããæ¡ä»¶ãæºãããã®ãæ¨ã¦ããã¨ãã«ä½¿ãã¾ãã
// ããããã³ã¼ãã£ã³ã°ãã¿ã¼ã³ãã®10 // å é ã«ãã空æååãããã¯nullãæ¨ã¦ã public IEnumerable<string> DropHeadEmpty(string[] target) { // å¹çæªããã ãã©ã·ã³ãã« var result = new List<string>(target); while (result.Count != 0 && string.IsNullOrEmpty(result[0])) { result.RemoveAt(0); } return result; }
// SkipWhileã§æ¸ãç´ã public IEnumerable<string> DropHeadEmpty(IEnumerable<string> target) { // ããã§ããã£ã¡ã®æ¹ãã·ã³ãã« return target.SkipWhile(string.IsNullOrEmpty); }
ã©ã ãå¼ãã使ã£ã¦ãã¾ããã
// 10è¦ç´ æ¨ã¦ãä¾ãSkipWhileã§ public IEnumerable<int> Drop10(IEnumerable<int> target) { return target.SkipWhile((_, i) => i < 10); }
Take
Skip ã¨ã¯éã«ãå é n è¦ç´ ãã»ããå ´åã«ä½¿ãã¾ãã
// ããããã³ã¼ãã£ã³ã°ãã¿ã¼ã³ãã®11 // å é 10è¦ç´ ãåå¾ãã public IEnumerable<int> Take10(int[] target) { var result = new List<int>(); for (int i = 0; i < 10; i++) { result.Add(target[i]); // 10è¦ç´ ãªãã£ããä¾å¤ã»ã»ã» } return result; }
// Takeã§æ¸ãç´ã public IEnumerable<int> Take10(IEnumerable<int> target) { return target.Take(10); // 10è¦ç´ ç¡ãã£ãããã£ãã¨ããã¾ã§è¿ã }
TakeWhile
å é ããæ¡ä»¶ãæºãããã ããæ¾ãããã¨ãã«ä½¿ãã¾ãã
// ããããã³ã¼ãã£ã³ã°ãã¿ã¼ã³ãã®12 // nullã¾ã§ã®è¦ç´ ãåå¾ public IEnumerable<string> TakeNotNull(IEnumerable<string> target) { var result = new List<string>(); foreach (var s in target) { if (s == null) { break; } result.Add(s); } return result; }
// TakeWhileã§æ¸ãç´ã public IEnumerable<string> TakeNotNull(IEnumerable<string> target) { return target.TakeWhile(s => s != null); }
First/FirstOrDefault
æ¡ä»¶ãæºããæåã®è¦ç´ ãã»ããã¨ãã«ä½¿ãã¾ãã
æ¡ä»¶ãæºããè¦ç´ ããªãã£ãå ´åãFirst ã¯ä¾å¤ãæãã¾ãããFirstOrDefault ã¯ããã©ã«ãå¤ãè¿ãã¾ãã
// ããããã³ã¼ãã£ã³ã°ãã¿ã¼ã³ãã®13 // 空æååã§ãnullã§ããªãæåã®è¦ç´ ãè¿ã public string FirstNotEmpty(IEnumerable<string> target) { foreach (var s in target) { if (string.IsNullOrEmpty(s) == false) { return s; } } throw new Exception(); }
// Firstã§æ¸ãç´ã public string FirstNotEmpty(IEnumerable<string> target) { return target.First(s => string.IsNullOrEmpty(s) == false); }
æ¡ä»¶ãæºããæå¾ã®è¦ç´ ãè¿ããLast/LastOrDefault ãããã¾ãã
ã¾ã¨ã
ããã¾ã§è¦ã¦ããããã«ãLINQ to Objects ã使ãã°ä»ã¾ã§æ¸ãã¦ããå®åçãªå¦çãã»ã¨ãã©æ¸ããªãã¦ãããªãã¾ãã
ããã ãã§ã¯ãªãããããã¯ãããã«ãã£ã¦çµã¿åããããã¨ãå¯è½ã§ãã
ä¾ãã°ãtarget.Where(...).Select(...) ãªããã£ã«ã¿ã¼ãã¦å¤æã§ãããtarget.SkipWhile(!A).TakeWhile(A) ãªãæ¡ä»¶ (A ãæ¡ä»¶ã®ã¤ãã) ãæºããæåã®å¡ãåå¾ã§ãã
ã§ã¯ãLINQ to Objects ã使ããã«èªåã§ã«ã¼ããæ¸ãæå³ã¯ä½ãããã®ã§ããããï¼
è¨ãæããã¨ãèªåã§ã«ã¼ããæ¸ãã¡ãªããã«ã¯ä½ãããã§ããããï¼
èããã«ã2 ã¤ã»ã©ããã£ã½ããã®ãæãã¤ãã¾ãã
- å¦çã追ããã¨ã§ä½ããã£ã¦ãããããã
- èªåã®å¥½ããªããã«æ¸ãã
ä»ã«ãããããããã¾ããããã¨ãããããã® 2 ã¤ãèãã¦ã¿ã¾ãã
ã¾ããå¦çã追ããã¨ã§ä½ããã£ã¦ãããããããã§ãããããã¯ã¤ã¾ããLINQ ã®åã¡ã½ãããä½ããããç¥ããªããã¨è¨ãæãããã¨ãã§ããã§ãããã
ãããã«ããããªãã³ã¼ãã« Select ãªãã¦ã¡ã½ãããåºã¦ãã¦ããæåã¯ãããããã¾ããããã
ã§ãããããã¯ãLINQ ã®åã¡ã½ãããä½ãããããããã°ãå¦çã追ãå¿
è¦ããªããªããã¨ãããã¨ãæå³ãã¾ãã
ãã®ã¨ã³ããªã§ä¸ãã LINQ ã®ã¡ã½ããã¯åæ°åã§ãã
ããããSQL ãç¥ã£ã¦ããã°ã©ããããã¨ãããã®ãæ³åã®ä»ãã¡ã½ãããå¤ããããAll ã AnyãFirst ãªããã¯ã¡ã½ããåãããã£ã¦ãããã¨ãç°¡åã«ãããã¾ãã
LINQ ã®ãã¹ã¦ã®ã¡ã½ããã䏿°ã«è¦ããå¿
è¦ã¯ããã¾ãããå¾ã
ã«è¦ãã¦ããã°ããã®ã§ãã
次ã«ãèªåã®å¥½ããªããã«æ¸ãããã§ãã
ããã¯ã¤ã¾ããããããããããã«ã¼ãã LINQ ã§ã¯æ¸ããªãï¼ã¨ãããã¨ã§ãããããã¯èª¤è§£ã§ãã
LINQ ã®åã¡ã½ããã¯çµã¿åããã容æã§ãããã£ãè¦ãããã«ãããã£ã«ã¿ã¼ãã¦å¤æãã Where 㨠Select ãçµã¿åãããã°å®ç¾ã§ãã¾ãã
ããã«ãèªåã§ã³ã¼ããæ¸ãã¨ãããã¨ã¯ãããã ããã°ãåãè¾¼ãä½å°ãä½ã£ã¦ãã¾ããã¨ãããã¨ã§ãããã¾ãã
ãã®ã¨ã³ããªã§ãããã¤ãã®ä¾ã«ããããããã°ãåãè¾¼ã¿ãããã¨ããã³ã¡ã³ããæ¸ãã¾ããããèªåã§ããããããããã«ã¼ããªãã¦ãã®ãæ¸ãã°ããã°ãåãè¾¼ãå¯è½æ§ã¯ããã«ä¸ããã¾ãã
LINQ to Objects ã使ããã¨ã«ãã£ã¦ããããã£ãå¯è½æ§ãæ¸ãããã¨ãã§ããã®ã§ãã
ãã®ããã«ãèªåã§ã«ã¼ããæ¸ãã¡ãªããã¯ãªãã¨è¨ã£ã¦ããã§ãããã
ã¨ã¯ãããã®ã®ããããªãç§»è¡ããã®ã¯ä¸å¯è½ã§ãããã
ãªã®ã§ãå¾ã
ã« LINQ to Objects ã使ã£ãã³ã¼ãã£ã³ã°ã«æ
£ãã¦ããã¾ãããã
LINQ ã®åã¡ã½ããã«ã¤ãã¦ãèªåã§å®è£
ãã¦ã¿ã¦ã©ããããã®ãçè§£ããã®ãããã¨æãã¾ãã
ãã ããã¼ãã«ã®é«ãã¡ã½ãããããã¤ãããã¾ãã®ã§ãããããã®ã¡ã½ãããããã¦ããã¾ãã
- All/Any
- Count/Sum
- Max/Min
- Skip/Take
- SkipWhile/TakeWhile
- Cast/Select
- OfType/Where
LINQ to Objects ã§ãããããã¼ãªããã°ã©ãçæ´»ãå§ã¾ãï¼
ããããã³ã¼ãã£ã³ã°ãã¿ã¼ã³ã¯æ¬å½ã«ããããï¼
ãããã«ãã®ã¾ã¾è¡¨ãããã¨ã¯ãããããªãã§ãã
ããããã®ãç½®ãã¦ãããã¨ãã¦ããæããã¦ãããªã«ããããç¶æ³ãªã®ãã»ã»ã»
ãããããã£ã¡ã®æ¹ãå¤ããããªæ°ããã¾ãã
// æ¬å½ã«ãããããã¿ã¼ã³ public void DoubleAll(int[] target) { for (int i = 0; i < target.Length; i++) { target[i] = target[i] * 2; } }
ããã§ãã弿°ãç´æ¥ããããã¿ã¼ã³ã§ãã
ãããæ»ãå¤ã®åã void ãªã®ã§ã¾ã ããã§ããã»ã»ã»
// çµæãè¿ãã®ã§ä¾¿å©ï¼ public int[] DoubleAll(int[] target) { for (int i = 0; i < target.Length; i++) { target[i] = target[i] * 2; } return target; }
ãããªã£ã¦ããå ´åãããåæ¾ãã¤ãã¾ããã
ãããæ¸ãã人ã¨ãã¦ã¯ã便å©ã«ä½¿ããããã«ãã¨ãããã¨ã§æ¸ããã®ã§ãããã
ã§ããããã使ãå´ããããã¨ããã¡ãã¡å¼æ°ãæ¸ãæãã¦ããªãã確ãããå¿
è¦ãããã¾ãã
ãããæ ãããæ¸ãæãã¦ãªãã ãããã¨æ±ºãã¤ãã¦ãã¾ãã¨ãã°ãçã¿ã¾ãã
éã«ããæ¸ãæãã¦ããããããªããã¨æ±ºãã¤ãã¦ãã¾ãã¨ãã¡ã½ããã«æ¸¡ãåã«å¸¸ã«ã³ãã¼ãããããªã³ã¼ããæ¸ããã¨ã«ãªããã³ã¼ãä¸ã«ãã¤ãºãå¢ãã¾ãã
ããããã弿°ãæ¸ãæãã¦ãããããªã³ã¼ããå¤ãå ´åãLINQ to Objects ã«åç´ã«ç½®ãæãããã¨ãã§ãã¾ããã
LINQ to Objects ã¯å
ã«ãªãã·ã¼ã±ã³ã¹ãæ¸ãæãããã¨ã¯ãã¾ããã
ãã®ãããæ¸¡ãã夿°ãæ¸ãæãã¦ãããã¨ãåæã¨ããã³ã¼ãããã£ãå ´åãLINQ to Objects ã«æ¸ãæãããã¨ã§æ¢åã³ã¼ããå£ãã¦ãã¾ãã®ã§ãã
ä»ããæ¸ãã³ã¼ãããã§ãããã®ã§ãããããã弿°ãæ¸ãæããããããªã³ã¼ãã¯æ¸ããªããæ¸ãããªãããã«ãã¦ããã¹ãã§ãããã
ããã¯ãLINQ ã使ãã使ããªã以åã®åé¡ã§ãã
ãããã¦ãã¿ãã
Javaプログラマが知るべき9のこと - @katzchang.contexts
Java ããã°ã©ãã¨è¨ãã¤ã¤ãC# ããã°ã©ãã VB ããã°ã©ããç¥ãã¹ããã¨ãæ¸ããã¦ãã¾ãã