質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

3453閲覧

C#で100本ノックをやるにあたり

tmtmshohei

総合スコア16

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2018/10/19 03:08

前提・実現したいこと

C#で100本ノックをやってみようということでやっているのですが、
1章04のコードをスッキリさせたいです。
LINQを使って書きたいのですが、条件指定(~番目のとき)という処理が思い浮かびません。

いい方法がございましたらご教示ください。

発生している問題・エラーメッセージ

該当のソースコード

C#

1var text = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."; 2 var line = text.Split(' '); 3 var cut = new List<string>(); 4 var result = new Dictionary<string, int>(); 5 6 for (int i = 0; i < line.Length;i++) 7 { 8 if(i==0 || i==4 || i==5 || i==6 || i==7 || i==8 || i==14 || i==15 || i==18) 9 { 10 cut.Add(line[i].Substring(0,1)); 11 } 12 else 13 { 14 cut.Add(line[i].Substring(0, 2)); 15 } 16 } 17 18 for (int i = 0; i < cut.Count;i++) 19 { 20 result.Add(cut[i], i+1); 21 } 22 foreach(var x in result) 23 { 24 Console.Write(x); 25 }

補足情報(FW/ツールのバージョンなど)

C#7

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yoorwm

2018/10/19 03:10

素朴な疑問なんですが、100本ノックって他の人にやってもらうようなもんなんすか?
tmtmshohei

2018/10/19 03:14

回答自体はできたのですが、無駄が多いコードだと感じたので最適化、レビュー的な意味合いで投稿させて頂きました。
退会済みユーザー

退会済みユーザー

2018/10/19 04:10

余計なおせっかいかもしれませんが、C#の練習でなく、言語処理そのものの手習いなのであれば、流行りの言語を選択したほうがベターですよ。
tmtmshohei

2018/10/19 04:23

ご助言ありがとうございます。今回は言語処理ではなく最近使う機会が増えてきたC#の練習という趣旨でした。
退会済みユーザー

退会済みユーザー

2018/10/19 04:24

なるほど!失礼しました^^
guest

回答1

0

ベストアンサー

序数を得るには Select<T, U>(Func<T, int, U>) を使います。
HashSet<T> を使えば集合の中から高速に検索できます。
最後に辞書を作れという指示なので、ToDictionary をつけろということでしょう。

C#

1using System; 2using System.Collections.Generic; 3using System.Linq; 4 5namespace ConsoleApp1 6{ 7 class Program 8 { 9 static void Main(string[] args) 10 { 11 var orders = new HashSet<int>(new[] { 1, 5, 6, 7, 8, 9, 15, 16, 19 }.Select(a => a - 1)); 12 var src = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."; 13 var result = src 14 .Split(' ') 15 .Select((a, i) => new { Value = a.Substring(0, orders.Contains(i) ? 1 : 2), Index = i }) 16 .ToDictionary(a => a.Value, a => a.Index + 1); 17 18 // 結果出力 19 Console.WriteLine(src); 20 foreach (var item in result) 21 { 22 Console.WriteLine($"{item.Key}: {item.Value}"); 23 } 24 Console.ReadKey(); 25 } 26 } 27}

投稿2018/10/19 03:44

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2018/10/19 04:03

使用時のシグネチャに合わせて Select<T, U>(Func<T, int, U>) と書きましたが、本来は public static System.Collections.Generic.IEnumerable<TResult> Select<TSource,TResult> (this System.Collections.Generic.IEnumerable<TSource> source, Func<TSource,int,TResult> selector); です。
Zuishin

2018/10/19 04:14 編集

あと、後で気づいたのですが、HashSet<T> を使えば高速になると書きましたが、それは一般論で、int の場合はハッシュと値が一致するので高速にはなりません。 大量の文字列その他のオブジェクトを探す場合に高速化が期待できます。 本当はここでは集合の量も少なく重複もないので List<T> で十分ですが、せっかくなのでそのままにしておきます。
tmtmshohei

2018/10/19 04:21

ありがとうございます、勉強になります。 ここで使っているSelectの引数(a,i)ですが、aには順次srcの要素が入るのはわかるのですが、 iにはイテレータとしてint型の数値が順次はいるのでしょうか?
tmtmshohei

2018/10/19 05:47

SelectIterator()内ですでに設定されているんですね。 HashSet<T>もほとんど使ったことがなかったので 文字列の処理の場合、積極的に使ってみます。 ご丁寧にありがとうございます。
tmtmshohei

2018/10/19 07:21

すみません、 Select以下の new { Value = a.Substring(0, orders.Contains(i) ? 1 : 2), Index = i })ですが new以下で作られているのは匿名配列になるのでしょうか?
Zuishin

2018/10/19 07:41

配列ではありません。匿名クラスのインスタンスです。 本当はタプルを使いたかったんですが、まだ使えない環境も多いので匿名クラスにしました。
tmtmshohei

2018/10/19 08:05

ありがとうございます、LINQ匿名クラスあたりは昨日から触り始めたのでごちゃごちゃしていました。 同じことがSelectManyと匿名配列でもできるんですね。 SelectMany((a, i) => new[] { new{Value=a.Substring(0,orders.Contains(i)?1:2),Index=i}}) 勉強になりました。
Zuishin

2018/10/19 08:20

できますが、要素数が一つの配列をわざわざ作ってその要素を取り出しているので、する意味は無いように思います。
tmtmshohei

2018/10/19 08:23

おっしゃるように実際にコードを書く際にはSelect()で処理したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問