Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
UnityでのLINQ活用例
Search
RyotaMurohoshi
February 20, 2015
Technology
29
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
UnityでのLINQ活用例
2015/02/20(金)の勉強会の資料です。
※元々はSlideShareで公開していた資料です。
RyotaMurohoshi
February 20, 2015
More Decks by RyotaMurohoshi
See All by RyotaMurohoshi
Tilemapのアップデートについて
ryotamurohoshi
0
100
Unityの合同同人誌や合同商業誌を書いてる僕は感想やレビューや評価が欲しい
ryotamurohoshi
0
630
Unity 2021.1での Unityパッケージの名称変更について
ryotamurohoshi
0
920
Odin Validationはいいぞ!
ryotamurohoshi
2
1.1k
Tilemapはいいぞ!2020 〜すごいぞ、プロジェクト専用拡張Brush〜
ryotamurohoshi
0
2.6k
Unityでも、新しいC#
ryotamurohoshi
0
1.5k
Riderはいいぞ!
ryotamurohoshi
1
3.8k
Riderのススメ〜俺はRiderここが好き〜
ryotamurohoshi
1
2.8k
Unity開発者に伝えたい.NETのこと
ryotamurohoshi
4
38k
Other Decks in Technology
See All in Technology
コンテナ運用におけるネットワーク・コンテナコストの削減方法/How to Reduce Network and Container Costs in Container Operations
masakiokuda
1
150
しろおびから始める!ログ活用の第一歩
shumei_ito
0
950
初海外で注意すべきこと12選!!!安全快適なre:invent生活にするために
yuuuuuuu168
1
160
Metadata - Section 1: HTML Basics
mohab1
0
120
実践! SRE × AI - ABEMA における AIOps -
tetsuya28
8
3.1k
PHPカンファレンス関西の招待状 / Invitation to PHP Conference Kansai
ykanoh
0
110
その Valkey 使いこなしていますか?
onk
PRO
5
1.5k
USB PDを使ってスマホを労わりたい
raspython3
0
180
[JAWS-UG彩の国埼玉#12]そろそろ準備する?re:Invent2026をやさしく解説 / reinvent2026-sainokuni
sh_fk2
1
340
1つのリクエストを追って理解する - llm-dのP/D分離
akhino
1
160
パスキーの自動テストはどこまでいけるのか
teamlab
PRO
0
200
実体験から学ぶ分析エージェントの開発と運⽤
recruitengineers
PRO
8
2.4k
Featured
See All Featured
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.2k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
2
6.3k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
300
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
460
Designing Experiences People Love
moore
143
24k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
440
The browser strikes back
jonoalderson
0
1.8k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
46k
Discover your Explorer Soul
emna__ayadi
2
1.3k
Deep Space Network (abreviated)
tonyrice
0
370
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
460
Transcript
UnityͰͷLINQ׆༻ྫ ྄ࣨଠ 2015/02/20(ۚ)
࣭Ͱ͢
UnityͰήʔϜΛ࡞͍ͯ͠Δํʁ
LINQ͍ͬͯΔํʁ
LINQ͍ͬͯΔํʁ
LINQ͕ͬͭΓ͍ͬͯΔํʁ
͋Γ͕ͱ͏͍͟͝·ͨ͠
UnityͰͷLINQͷ׆༻ࣄྫΛ௨͠ɺ LINQͷྑ͞ར༻ํ๏Λհ͠·͢ɻ
ࠓͷඪ Έͳ͞Μʹ • LINQΛ͏ͱίʔυ͕ಡΈ͘͢ͳΔ͜ͱΛͬͯΒ͏ • LINQΛ׆༻Ͱ͖Δγʔϯ͕ଟ͍͜ͱΛͬͯΒ͏ • LINQΛͬͯΈΑ͏ɾษڧͯ͠ΈΑ͏ͱࢥͬͯΒ͏ • LINQʹ͜Μͳศརͳϝιου͋ͬͨΜͩͱͬͯΒ͏
UnityͰͷྫΛ௨ͯ͠ʂ
ͱ͜ΖͰ
ήʔϜ։ൃͰେͳͷ ͨ͘͞Μ͋Γ·͢ΑͶ
ͦͷதͷͻͱͭ
؆ܿͰಡΈ͍͢ίʔυ
ͳ͔ͥͬͯʁ ಈ͚ಉ͡͡Όͳ͍͔ͬͯʁ
༷ɺมΘΓ·͢ΑͶʁ ϦϦʔεޙΞϓσ͠·͢ΑͶʁ
ʮԚ͍ίʔυͰͱΓ͋͑ͣಈ͘ʯ ظతʹૣ͍͔͠Εͳ͍ ×"ظతͳ։ൃ ̋!தɾظతͳ։ൃ
༷։ൃ్தͰมΘΓ·͢ΑͶʁ ؆ܿͰಡΈ͘͢حྷͳίʔυ ͜ΕʹൺͯԚ͍͘ίʔυͷ ༷มߋͱͯେมʂ
༡ͼͳ͕Βࢼߦࡨޡ͠໘ന͍Λ࡞Δ ͦΕʹ؆ܿͰಡΈ͍҆ίʔυ͕ඞཁʂ ͋ͱԚ͍͘ίʔυɺ·͡Ξϓσ͠ΜͲ͍ʂ
ಡΈ͍͢ίʔυେ ࢍ͍͚ͯͨͩ͠·͔͢ʁ
ͱ͜ΖͰࠓͷςʔϚ LINQͰ͢
LINQΛ͏ͱɺ ϦετͳͲͷίϨΫγϣϯΛѻ͏ίʔυ͕ɺ ؆ܿʹಡΈ͘͢ͳΓ·͢Αʂ
ͯ͞ɺLINQͱ
LINQͱ ౷߹ݴޠΫΤϦ!(LINQ)!ɺڧྗͳΫΤϦػೳΛ!C#!ݴޠ͓Αͼ! Visual!Basic!ݴޠͷߏจͱ֦ு͢ΔɺVisual!Studio!2008!Ͱಋೖ ͞ΕͨػೳͷηοτͰ͢ɻ! MSDN%LINQΑΓh*ps:/ /msdn.microso7.com/ja:jp/library/bb397926.aspx
ΠϝʔδΘ͖·͢ʁ
ྻͱ͔Ϧετͱ͔σΟΫγϣφϦͱ͔ γʔέϯε(↑ͷΑ͏ͳΦϒδΣͷू·Γ)Λ Λѻ͏ίʔυ͕LINQΛ͏ͱ៉ྷʹॻ͚Δ ͬͯ͜ͱ͚ͩͱΓ͋͑ͣࠓΠϝʔδ͍ͯͩ͘͠͞(దͰ͍͢·ͤΜ) ࠓ͓͢͠ΔͷɺLINQ%to%ObjectsͰ͢ ࠓͷͰʮLINQ͕͑ΔΑ͏ʹͳΔʯͱͳΓ·ͤΜɻΈͳ͞Μʹศར͞Λհ͠Α͏ͱࢥ͍·͢ɻ
ࣗݾհ • ໊લ:྄ࣨଠ • ॴଐ:Fuller,)Inc. • ࣄ:UnityΛ༻͍ͨήʔϜ։ൃ • ߘઌ:h3p:/ /qiita.com/RyotaMurohoshi
• Twi3er:@RyotaMurohoshi • ίϛϡχςΟ:AndroidͷձUnity෦
ϥΠϒϥϦUniLinq࡞ͬͨΓ UniBookͰLINQʹ͍ͭͯॻ͍ͨΓ
LINQେ͖Ͱ͢ʂ ʮLINQͷͳ͍C#ͳΜͯC#͡Όͳ͍ʯ ͬͯݴ͏ํ͍·͕͢ɺࢲͦ͏ࢥ͍·͢ʂ
ͦΜͳࢲ͕ ͜͏͍͏෩ʹ͑Δɺ͜Μͳঢ়گͰ͑Δ ͱ͍͏ྫΛΨϯΨϯհ͍͖ͯ͠·͢
ୈҰ෦ ࠓ͙͢ʹͬͯཉ͍͠ϝιου3બ CountɾAllɾAny
͜ΜͳΫϥε͕͋ͬͯ public class Monster { public int Id { get;
set; } public string Name { get; set; } public int Hp { get; set; } /* தུ */ }
List<Monster>ͷதͰHp͕0ҎԼͷཁૉΛ͑Δ ͷΑ͏ͳϦετͷࢦఆͷ݅Λຬͨͨ͠ཁૉΛ͑Δ ͬͯ͜ͱΓ·ͤΜʁ
Count ಛఆͷ݅Λຬͨͨ͠ཁૉΛ͑Δ
Hp͕0ҎԼͷཁૉɺͭ·ΓࢮΜͰ͍Δ Ϟϯελʔ(Monster)ͷΛ͍͑ͨ
Α͋͘Δforeachɺifͷίʔυ List<Monster> monsterList = LoadMonsterList (); // LINQΛΘͳ͍ͱ int deadMonsterCount
= 0; foreach (Monster monster in monsterList) { if(monster.Hp <= 0) { deadMonsterCount++; } }
Count ࢦఆͷ݅Λຬͨͨ͠ཁૉΛ͑Δ List<Monster> monsterList = LoadMonsterList (); // Hp͕0ҎԼͷཁૉͷʹ int
deadMonsterCount = monsterList.Count ((Monster monster) => monster.Hp <= 0);
͖ͬ͞ͷ2ͭͷίʔυ Ͳ͏ಡΊ·͢ʁ
͜ͷίʔυɺͲ͏ಡΈ·͢ʁ List<Monster> monsterList = LoadMonsterList (); // LINQΛΘͳ͍ͱ int deadMonsterCount
= 0; foreach (Monster monster in monsterList) { if(monster.Hp <= 0) { deadMonsterCount++; } }
intܕͷdeadMonsterCountΛ0ͰॳظԽ foreachจͰmonsterListΛ·Θ͢ ͠ཁૉͷmonsterͷHp͕0ҎԼͳΒ deadMonsterCountΛΠϯΫϦϝϯτ
͋ɺͭ·Γʂ HP͕0ҎԼͷϞϯελʔΛ͑Δͷ͔ʂ ͱ͍͏1ճ಄ͷதͰͷม͕ඞཁ
ҰํLINQʁͲ͏ಡΈ·͢ʁ // LINQΛ͏ͱ List<Monster> monsterList = LoadMonsterList (); // Hp͕0ҎԼͷཁૉͷʹ
int deadMonsterCount = monsterList.Count ((Monster monster) => monster.Hp <= 0);
intܕͷdeadMonsterCountΛ࣍ͷͰॳظԽ monsterListͷ࣍ͷ݅Λຬͨ͢ཁૉͩʂ ݅ཁૉͷHP͕0ҎԼͩʂ
΄΅ҙຯతʹɺ ʮHp͕0ҎԼͷϞϯελʔΛ͑Ζʂʯ ࠨ͔ΒӈʹૉʹಡΊΔʂ
foreachจɺifจͷ ʮͲ͏ॲཧ͍ͯ͠Δ͔ʯ͕ॻ͔Ε͍ͯΔ LINQͰ ʮԿ͕͍͔ͨ͠ʯ͕ॻ͔Ε͍ͯΔ
͔ͩΒLINQͷίʔυಡΈ͍͢ ͔͠؆ܿ
͔͜͜ΒجຊɺLINQ൛ͷΈͰ͘͘͞͞ߦ͖·͢
Any ಛఆͷ݅Λຬͨ͢ཁૉ͕ ଘࡏ͢Δ͔ௐΔ
Any ಛఆͷ݅Λຬͨ͢ཁૉ͕ଘࡏ͢Δ͔ௐΔ List<Monster> monsterList = LoadMonsterList (); // Hp͕0ҎԼͷϞϯελʔ͕ଘࡏ͢Εtrue bool
isExistDeadMonster = monsterList.Any((Monster monster) => monster.Hp <= 0);
All શͯͷཁૉ͕ࢦఆͷ݅Λ ຬ͔ͨ͢ௐΔ
All શͯͷཁૉ͕ࢦఆͷ݅Λຬ͔ͨ͢ௐΔ List<Monster> monsterList = LoadMonsterList (); // શͯͷϞϯελʔͷHp͕0ҎԼͳΒtrue bool
isAllMonsterDead = monsterList.All((Monster monster) => monster.Hp <= 0);
࣍UnityͬΆ͍ͷͰ ͔ͭ ׂͱϚΠφʔͳͭΛ
ୈೋ෦ Editor֦ுͰ׆༂ OfType
OfType ࢦఆͷܕͷཁૉͷΈʹϑΟϧλϦϯά͠ɺ ࢦఆͷܕͷγʔέϯεʹม
ProjectΟϯυதͰબதͷͷதͰɺ ςΫενϟ(TextureΫϥε)ͷΈΛॲཧ͢Δ (UnityEditor֦ு)
• UnityEditor.Selec0onΫϥεͷobjectsϓϩύςΟΛར༻ • Selec0on.objectsݱࡏબ͍ͯ͠ΔͷΛऔಘ • ܕUnityEngine.Object[]Ͱऔಘ • ͜ΕʹવςΫενϟ(TextureΫϥε)Ҏ֎ͷͷؚ·ΕΔ • ͚ͲTextureͷΈΛରʹ͍ͨ͠
ϑΟϧλϦϯάͱ͍͑Where ͜ΕΛisԋࢉࢠͱ͋Θͤͯ foreach (UnityEngine.Object target in Selection.objects.Where (o => o
is Texture)){ // Ωϟετ͢Δ or asԋࢉࢠར༻͕ΊΜͲ͍ Texture texture = target as Texture; // ͜͜ͰTextureʹԿ͔͠Βͷॲཧ }
CastϝιουͰΩϟετͰ͖·͕͢ foreach (Texture texture in Selection.objects .Where (o => o
is Texture) .Cast<Texture>()){ // ͜͜ͰTextureʹԿ͔͠Βͷॲཧ }
ͦ͜ͰOfTypeͰ͢Αʂ
OfType ࢦఆͷܕͷཁૉͷΈʹϑΟϧλϦϯά͠ɺࢦఆͷܕͷγʔέϯεʹม // Selection.objectsͷதͷཁૉΛTextureܕͷΈʹϑΟϧλϦϯά͠ɺ // IEnumerable<Texture>ʹม foreach (Texture texture in
Selection.objects.OfType<Texture> ()){ // ͜͜ͰTextureʹԿ͔͠Βͷॲཧ }
UnityͷEditor֦ுͰɺSelec.onར༻γʔϯ͕ଟ͍ʂ (MenuItemͱ߹Θͤͯಋೖָ͕ʂ) ʮSelec%on.objects.OfType<Texture>7()ʯɺͥͻʂ ࣮ࡍʹͬͨྫ͕ͪ͜Βʂ!h#p:/ /qiita.com/RyotaMurohoshi/items/b01e3cdb91fea96f4574
OfTypeϝιου ଞͰNUnitLiteͱ͍͏ϥΠϒϥϦΛͬͨࡍ System.Object͔ΒಛఆͷܕͷมͰ͍·ͨ͠
Editor֦ுͰͷLINQ׆༻ LINQɺ࣮iOSͰ͕͋Γ·͢ ͚ΕͲUnityEditorͰ͋Εେৎʂ Editor֦ு͔Βར༻࢝͠ΊΔͷΦεεϝʂ
ୈࡾ෦ ࢦఆͷ݅Λຬͨ͢ઌ಄ͷཁૉΛऔಘ͢Δ FirstɺFirstOrDefault
List<Monster>ͷதͰHp͕0ҎԼͷཁૉ͕Ұͭཉ͍͠ ͷΑ͏ͳϦετͷࢦఆͷ݅Λຬͨ͢ཁૉΛҰͭऔಘ͢Δ ͬͯ͜ͱΓ·ͤΜʁ
First ࢦఆͷ݅Λຬͨ͢ઌ಄ͷཁૉΛऔಘ͢Δ ݅Λຬͨͨ͠ཁૉ͕ͳ͍߹ྫ֎ൃੜ
First ࢦఆͷ݅Λຬͨ͢ઌ಄ͷཁૉΛऔಘ͢Δɻ݅Λຬͨͨ͠ཁૉ͕ͳ͍߹ྫ֎ൃੜ List<Monster> monsterList = LoadMonsterList (); // ͻͱͭHp͕0ҎԼͷཁૉ͕ଘࡏ͠ͳ͍ͳΒྫ֎ൃੜ Monster
deadMonster = monsterList .First ((Monster monster) => monster.Hp <= 0);
Firstϝιου ݅Λຬͨ͢ཁૉ͕ͳ͍߹ྫ֎͕ൃੜʂ ͡Ό͋ྫ֎Λൃੜͨ͘ͳ͍߹ʁ AnyͰଘࡏνΣοΫͯ͋ͬͨ͠߹ͷΈɺ͘͠ɽɽɽ
FirstOrDefault ࢦఆͷ݅Λຬͨ͢ઌ಄ͷཁૉΛऔಘ͢Δ ݅Λຬͨͨ͠ཁૉ͕ͳ͍߹ ͦͷܕͷنఆΛฦ͢
݅Λຬͨͨ͠ཁૉ͕ͳ͍߹ɺ ʮنఆΛฦ͢=nullΛฦ͢ʯ͡Όͳ͍ʂ ͜͜ཁҙʂܕͷنఆnull͡Όͳ͍ʂ
نఆ • Ϋϥεܕͷ߹ɺnull • intͷ߹ɺ0 • floatͷ߹ɺ0.0F • boolͷ߹ɺfalse •
Vector3ͷ߹ɺxɺyɺz͕શͯ0.0F
FirstOrDefault ࢦఆͷ݅Λຬͨ͢ઌ಄ͷཁૉΛऔಘ͢Δɻ݅Λຬͨͨ͠ཁૉ͕ͳ͍߹ͦͷܕͷنఆΛฦ͢ List<Monster> monsterList = LoadMonsterList (); // ͻͱͭHp͕0ҎԼͷཁૉ͕ଘࡏ͠ͳ͍ͳΒMonsterΫϥεͷنఆnullʹ Monster
deadMonster = monsterList .FirstOrDefault ((Monster monster) => monster.Hp <= 0);
͜͜Ͱ͞Βʹ͏Ұͭʂ
DefaultIfEmpty γʔέϯε͕ۭͳΒҾͰͨ͠ͷΛ །Ұͷཁૉͱ͢Δγʔέϯεʹม
FirstͱΈ߹Θͤͯ͜Μͳ͜ͱ͕Ͱ͖Δ
DefaultIfEmpty γʔέϯε͕ۭͳΒҾͰͨ͠ͷΛ།Ұͷཁૉͱ͢Δγʔέϯεʹม List<Monster> monsterList = LoadMonsterList (); Monster defaultMonster =
GetDefaultMonster (); int targetId = GetTargetId (); // ࢦఆIDͷϞϯελʔΛ୳͢ɻͳ͔ͬͨΒdefaultMonsterʹɻ Monster targetMonster = monsterList .Where ((Monster monster) => monster.Id == targetId) .DefaultIfEmpty (defaultMonster) .First (); // ͜ͷΦʔόʔϩʔυ୯७ʹઌ಄ཁૉऔಘ
ͱ͜ΖͰ
σϦήʔτͱϥϜμࣜ • ʮ(Monster*monster)*=>*monster.Hp*<=*0ʯϥϜμࣜ • ʮϥϜμࣜʯͰͳ͘ʮσϦήʔτʯΛҾʹͱΔ • LINQͷଟ͘ͷϝιου͕Func<T,*TResult>ΛऔΔ • ϥϜμࣜͷ༻్ͷҰͭσϦήʔτͷੜ ৄ͘͠ʂɹh"p:/
/qiita.com/RyotaMurohoshi/items/740151bd772889cf07deɹʹ·ͱΊ·ͨ͠
ୈ࢛෦ ࢉज़ܭࢉܥ MaxɺMinɺSumɺAverage
͜ΜͳΫϥεΛ͍·͢ public class PlayLog { public int StageId { get;
set; } public int Score { get; set; } public DateTime PlayedAt { get; set; } public TimeSpan PlayTime { get; set; } }
List<PlayLog>ͷཁૉͷதͰҰ൪େ͖͍ScoreΛٻΊΔ ͷΑ͏ͳϦετཁૉΛมͯ͠ɺͦͷҰ൪େ͖͍ΛٻΊΔ ͬͯ͜ͱΓ·ͤΜʁ
Max ֤ཁૉʹมΛࢪͦ͠ͷ࠷େΛܭࢉ͢Δ
Max ֤ཁૉʹมΛࢪͦ͠ͷ࠷େΛܭࢉ͢Δ List<PlayLog> playLogList = LoadPlayLogList (); // PlayLogListͷScoreͷ࠷େ int
maxScore = playLogList.Max ((PlayLog playLog) => playLog.Score);
Min ֤ཁૉʹมΛࢪͦ͠ͷ࠷খΛܭࢉ͢Δ
Min ֤ཁૉʹมΛࢪͦ͠ͷ࠷খΛܭࢉ͢Δ List<PlayLog> playLogList = LoadPlayLogList (); // PlayLogListͷScoreͷ࠷খ int
minScore = playLogList.Min ((PlayLog playLog) => playLog.Score);
Sum ֤ཁૉʹมΛࢪͦ͠ͷ߹ܭΛܭࢉ͢Δ
Sum ֤ཁૉʹมΛࢪͦ͠ͷ߹ܭΛܭࢉ͢Δ List<PlayLog> playLogList = LoadPlayLogList (); // PlayLogListͷScoreͷ߹ܭ int
sumOfScore = playLogList.Sum ((PlayLog playLog) => playLog.Score);
Average ֤ཁૉʹมΛࢪͦ͠ͷฏۉΛܭࢉ͢Δ
Average ֤ཁૉʹมΛࢪͦ͠ͷฏۉΛܭࢉ͢Δ List<PlayLog> playLogList = LoadPlayLogList (); // PlayLogListͷScoreͷฏۉ double
averageOfScore = playLogList.Average ((PlayLog playLog) => playLog.Score);
ͱ͜ΖͰ
LINQͱiOS(1) • Unity+iOSͩͱ࣮ػ࣮ߦ࣌ΤϥʔʹͳΔ͜ͱ͕͋Δ • ཧ༝AOTίϯύΠϧ͕͏·͍͍ͬͯ͘ͳ͍Έ͍ͨ • ͦΕΛղܾ͢ΔͨΊʹUniLinq͍ͬͯ͏ͭΛ࡞ͬͨ
LINQͱiOS(2) • IL2CPPొ • IL2CPPͰେৎ͔ࢼͨ͠Βɺςετ͢Δ͕࣮ͭػͰΤϥʔʹ • AssemblyΫϥεͷCodePathϓϩύςΟ͕nullͳͷ͕ݪҼ • ࠓޙਖ਼͘͠ಈ͔͘Ͳ͏͔ͳͲɺܧଓͯ͠ௐ͍͖ͯ·͢ʂ
ୈޒ෦ ฒͼସ͑ OrderByɺOrderByDescending ThenByɺThenByDescending
List<PlayLog>ΛScroreͷ߱ॱͰฒͼม͑Δ ͷΑ͏ͳྻૢ࡞ ͬͯΓ·ͤΜʁ
OrderBy ֤ཁૉʹมΛࢪ͠ ͦͷ݁ՌͰฒͼସ͑
OrderBy ֤ཁૉʹมΛࢪͦ͠ͷ݁ՌͰฒͼସ͑ List<PlayLog> playLogList = LoadPlayLogList (); // είΞͷ߱ॱͰฒͼସ͑ IEnumerable<PlayLog>
orderedPlayLog = playLogList .OrderByDescending ((PlayLog playLog) => playLog.Score); OrderByঢॱͰฒͼସ͑ɺOrderByDescending߱ॱͰฒͼସ͑ ݩͷσʔλΛฒͼม͑ΔͷͰͳ͘ɺ৽ͨʹฒͼସ͑ͨγʔέϯεΛͭ͘Δ
͠ಉ͡ScoreͳΒͲ͏͠Α͏ʁ ಉScoreͳΒPlayTime͕͍ॱʹ͍ͨ͠߹ʁ
͏ҰOrderByΛݺͿͷؒҧ͍ʂ
ThenBy OrderByͰฒͼସ͑ͨͷͰɺ ಉධՁͩͬͨͷΛฒͼସ͑
ThenBy OrderByͰฒͼସ͑ͨͷͰɺಉධՁͩͬͨͷΛฒͼସ͑ List<PlayLog> playLogList = LoadPlayLogList (); // είΞͷ߱ॱͰฒͼସ͑ͯɺಉͳΒ͕͍࣌ؒํΛઌʹ IEnumerable<PlayLog>
orderedPlayLog =ɹplayLogList .OrderByDescending ((PlayLog playLog) => playLog.Score) .ThenBy ((PlayLog playLog) => playLog.PlayTime);
ୈ෦ εΩοϓͱऔಘ SkipɺTakeɺSkipWhileɺTakeWhile
σʔλΛը໘ʹ10ݸͣͭදࣔ ΠϯσοΫε0ͷ1ϖʔδɺ0൪͔Β9൪ ΠϯσοΫε1ͷ2ϖʔδɺ10൪͔Β19൪ ΠϯσοΫε2ͷ3ϖʔδɺ20൪͔Β29൪ ͬͯ͜ͱΓ·ͤΜ
Skip%+%Take
Skip ઌ಄͔ΒҾͰͨ͠ݸ͚ͩ ཁૉΛඈ͢
Take ઌ಄͔ΒҾͰͨ͠ݸ͚ͩ ཁૉΛฦ͢
Skip+Take σʔλΛը໘ʹ10ݸͣͭදࣔɺࠓճ3ϖʔδ(ΠϯσοΫε2) List<PlayLog> playLogList = LoadPlayLogList (); int numPerPage =
10; int pageIndex = 2; int skipNum = numPerPage * pageIndex; // 3ϖʔδ(ΠϯσοΫε2)ɺ20൪͔Β10ݸͷཁૉΛऔಘ IEnumerable<PlayLog> selectedPlayLogs =ɹplayLogList .Skip (skipNum) .Take (numPerPage);
ࠓɺDateTimeܕͷPlayedAtͷঢॱͰPlayLog͕ฒΜͰ͍Δ ͋Δ࣌ࠁ͔Βɺଞͷ͋Δ࣌ࠁ·ͰͷσʔλΛऔಘ͍ͨ͠
SkipWhile)+)TakeWhile
SkipWhile ઌ಄͔ΒҾͰ͕ͨ݅͠ਅͷؒ ཁૉΛඈ͢
TakeWhile ઌ಄͔ΒҾͰ͕ͨ݅͠ਅͷؒ ཁૉΛฦ͢
SkipWhile)+)TakeWhile List<PlayLog> playLogList = LoadPlayLogList (); DateTime start = GetStartTime
(); DateTime end = GetEndTime (); // PlayedAt͕startΑΓޙorಉ࣌ࠁͰɺendΑΓલͳཁૉΛऔಘ IEnumerable<PlayLog> selectedPlayLogs =ɹplayLogList .SkipWhile ((PlayLog playLog) => playLog.PlayedAt < start) .TakeWhile ((PlayLog playLog) => playLog.PlayedAt < end);
ୈࣣ෦ ͦͷଞΦεεϝ
ElementAt γʔέϯεதͷ ࢦఆͷΠϯσοΫεͷཁૉΛऔಘ
⚪൪ΠϯσοΫεͷཁૉ͕ཉ͍͠ ͜͏͍͏࣌ɺ͋Γ·͢ΑͶɻͲ͏͠·͢ʁ ͋·Γॻ͔ͳ͍͔͠Εͳ͍͚ͲɺϦϑΝΫλϦϯάͷ్தͰඞཁͳ͜ͱ͋Δʁ
ଟ͘ͷLINQϝιουͷฦܕͰ͋ΔɺIEnumerable<T>ܕ ΠϯσΫαͰཁૉʹΞΫηεͰ͖ͳ͍ʂ
ToArrayμϝઈରʂ // ToArrayͰྻʹ͔ͯ͠ΒΞΫηεʁ // ޮѱ͍ʂʂʂ // playLogsIEnumerable<PlayLog>ܕ PlayLog index5PlayLog =
playLogs.ToArray ()[5];
ElementAt // ΠϯσΫαͳ͍͚ΕͲ // ElementAtϝιουͰΠϯσοΫεʹΞΫηεͰ͖Δ PlayLog index5PlayLog = playLogs.ElementAt (5);
ToDic&onary γʔέϯε͔ΒࣙॻΛ࡞Δ ΩʔΛࢦఆ͢ΔɻόϦϡʔࢦఆͰ͖Δɻ
͜ΜͳΫϥεΛ͍·͢ public class Item { public int Id { get;
set; } public string Name { get; set; } public ItemType ItemType { get; set; } } public enum ItemType { Weapon, ConsumptionItem, ValuableItem }
List<Item>*͔ΒItemͷIdΛΩʔͱ͢Δ Dic$onary<int,-Item>Λͭ͘Δ Έ͍ͨͳ͜ͱͨ͋͘͠Γ·ͤΜʁ ͦΕLINQͰҰߦͰ͔͚·͢ʂ
ToDic&onary γʔέϯε͔ΒࣙॻΛ࡞Δ!(ͦͷ1) List<Item> itemList = LoadItemList (); // IdϓϩύςΟΛΩʔͱ͢ΔσΟΫγϣφϦͷੜ //
͠Ωʔͷॏෳ͕͋ͬͨΒྫ֎͕ൃੜ Dictionary<int, Item> itemDict = itemList .ToDictionary((Item item) => item.Id);
ToDic&onary γʔέϯε͔ΒࣙॻΛ࡞Δ!(ͦͷ2) List<Item> itemList = LoadItemList (); // IdϓϩύςΟΛΩʔɺNameϓϩύςΟόϦϡʔͱ͢Δ //
σΟΫγϣφϦͷੜ // ͠Ωʔͷॏෳ͕͋ͬͨΒྫ֎͕ൃੜ Dictionary<int, string> itemDict = itemList.ToDictionary( (Item item) => item.Id, (Item item) => item.Name);
ToLookup γʔέϯε͔ΒILookupΛ࡞Δ άϧʔϓԽͨ͠ίϨΫγϣϯΛੜ
List<Item>*itemList͕͋ͬͯ Dic$onary<ItemType,2List<Item>>͕ཉ͍͠ LINQʹDic(onary<ItemType,5List<Item>>ʹࣅ͍ͯΔ ILookup<ItemType,.Item>͕࡞ΕΔϝιου͕͋Δ
ToLookup γʔέϯε͔ΒILookupΛ࡞Δ(άϧʔϓԽͨ͠ίϨΫγϣϯΛੜ) List<Item> itemList = LoadItemList (); // ILookup<ItemType, Items>
// Dictionary<ItemType,List<Item>>ʹࣅ͍ͯΔ ILookup<ItemType, Item> itemLookup = itemList. ToLookup((Item item) => item.ItemType); // σΟΫγϣφϦͷΑ͏ʹ[]ͱΩʔͰͦͷάϧʔϓʹΞΫηεͰ͖Δ IEnumerable<Item> weapons = itemLookup[ItemType.Weapon];
SelectMany ϦετͷϦετͷฏԽΛߦ͏
SelectMany ϦετͷϦετͷฏԽΛߦ͏(ͦͷ1) // ϞϯελʔͷϦετͷϦετ List<List<Monster>> listOfMonsterList = LoadListOfMonsterList (); //
Ϟϯελʔͷγʔέϯεʹ IEnumerable<Monster> monsters = listOfMonsterList .SelectMany ((List<Monster> list) => list);
SelectManyϦετͷϦετ͚͕ͩର͡Όͳ͍ ݁ߏ͑Δʂ
͜ΜͳΫϥε͕͋ͬͯ public class MonsterParty { public string Name { get;
set; } // MonsterͷϦετɺ͜ͷϓϩύςΟ͕ϛι public List<Monster> MonsterList { get; set; } }
SelectMany ϦετͷϦετͷฏԽΛߦ͏(ͦͷ2) // ύʔςΟʔͷϦετ List<MonsterParty> monsterPartyList = LoadMonsterPartyList (); //
Ϟϯελʔͷγʔέϯεʹ IEnumerable<Monster> monsters = monsterPartyList .SelectMany ((MonsterParty party) => party.MonsterList);
Dis$nct ॏෳΛআ͘
Dis$nct ॏෳΛআ͘ // γϯϓϧͳྫ int[] ids = new int[]{0, 1,
1, 2, 2, 2, 3, 3, 4}; // ॏෳ͕আ͔Ε͍ͯΔ IEnumerable<int> distinctedIds = ids.Distinct ();
Dis$nct ॏෳΛআ͘ // ύʔςΟʔʹಉ͡Ϟϯελʔ͍ͳ͍͕ɺଞͷύʔςΟʔʹಉ͡Ϟϯελʔ͕͍Δ List<MonsterParty> monsterPartyList = LoadMonsterPartyList (); //
ॏෳͷແ͠ϞϯελʔͷIdͷγʔέϯεΛ࡞Δ IEnumerable<int> monsterIds = monsterPartyList // Ϟϯελʔͷγʔέϯεʹͯ͠ .SelectMany (party => party.MonsterList) // Idͷγʔέϯεʹͯ͠ .Select (monster => monster.Id) // ॏෳΛഉআ͢Δ .Distinct ();
ͪͳΈʹLINQʹ࣍ͷΑ͏ͳू߹ԋࢉΛߦ͏ͷ͋Γ·͢ ࠩू߹ΛٻΊΔ!Except ू߹ΛٻΊΔ!Union ੵू߹ΛٻΊΔ!Intersect
Join ೋͭͷγʔέϯεΛΩʔͰಥ߹
PlayLogΫϥεͱStageDataΫϥε͔ΒɺPlayDataΛ࡞Γ͍ͨ public class PlayLog { // StageͷIdͷΈͰStageͷใͳ͍ public int StageId
{ get; set; } public int Score { get; set; } /* தུ */ } public class StageData { public int Id { get; set; } public string Name { get; set; } /* தུ */ }
PlayLogΫϥεͱStageDataΫϥε͔ΒɺPlayDataΛ࡞Γ͍ͨ public class PlayData { // StageDataΫϥεͷ໊લ͔Β public string StageName
{ get; set; } // PlayLogΫϥεͷScore͔Β public int Score { get; set; } /* தུ */ }
List<PlayLog>ͳplayLogListͱ List<StageData>ͳstageDataList͔Β PlayDataͷγʔέϯεΛ࡞Γ͍ͨ
foreachͳྫ // foreachͳྫɺ͍ List<PlayData> playDataList = new List<PlayData> (); foreach(PlayLog
playLog in playLogList) { StageData targetStageData = null; foreach(StageData stageData in stageDataList) { if (playLog.StageId == stageData.Id) { targetStageData = stageData; break; // nullͳͭͳ͍ΑͶͱ͍͏ίʔυ } } playDataList.Add (new PlayData { StageName = targetStageData.Name, Score = playLog.Score, }); }
LINQར༻ͳྫ // LINQར༻ͳྫɺ·͍ͩ List<PlayData> playDataList = new List<PlayData> (); foreach(PlayLog
playLog in playLogList) { StageData stageData = stageDataList.First (stage => stage.Id == playLog.StageId); playDataList.Add (new PlayData { StageName = stageData.Name, Score = playLog.Score, }); }
Joinͷྫ IEnumerable<PlayData> playDatas = playLogList.Join ( stageDataList, (PlayLog playLog) =>
playLog.StageId, // PlayLogͷΩʔ (StageData stageData) => stageData.Id, // StageDataͷΩʔ // ೋͭͷΩʔ͕ἧͬͨPlayLogͱStageData͕དྷΔ (PlayLog playLog, StageData stageData) => new PlayData { StageName = stageData.Name, Score = playLog.Score, });
ͯ͞
LINQͱͷ͖͍ͭ͋ํ • ΤϥʔʹͳΒͳ͍ϥΠϒϥϦΛ࡞Δor͏ • ΤϥʔʹͳΔϝιουor͍ํͰΘͳ͍ • Editor֦ுͷΈͰ͏ • ΤϥʔʹͳΔ͕Δ·Ͱͭ
Կ͔࣭͋Γ·͢ʁ
ͯ͞ɺࠓͷඪͷ͓͞Β͍Ͱ͢
ࠓͷඪ Έͳ͞Μʹ • LINQΛ͏ͱίʔυ͕៉ྷʹͳΔ͜ͱΛͬͯΒ͏ • LINQΛ͑Δ׆༻γʔϯ͕ଟ͍͜ͱΛͬͯΒ͏ • LINQΛͬͯΈΑ͏ɾษڧͯ͠ΈΑ͏ͱࢥͬͯΒ͏ • LINQʹ͜Μͳศརͳϝιου͋ͬͨΜͩͱͬͯΒ͏
͍͔͕ͩͬͨͰ͠ΐ͏͔ʁ LINQͬͯΈͨ͘ͳΓ·͔ͨ͠ʁ
͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ @RyotaMurohoshi