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

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

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

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

Q&A

解決済

7回答

4348閲覧

C# リストからの値の取り方について

hartman

総合スコア13

C#

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

0グッド

0クリップ

投稿2017/05/06 07:05

編集2017/05/18 15:24

C# リストからの値の取り方について

class Sample { public string No; public string Name; }

このようなクラスをリストで保持しているときに
Noだけを取得しカンマ区切りで一つの文字列としたいのです。
Noが2、1、3の順にあったらそのまま ”2,1,3” としたいです。

foreachでリストを回していけばいいと思っているのですが
カンマをつける際にNo + "," とか ”,” + No と書いた場合に
”2,1,3,” ",2,1,3" のようにしたくないので
最初または最後だったらとか判定しなくちゃいけいないと思うとコードが少し
ごちゃごちゃしてしまいます。

値の取得方法やカンマのつけ方など含めて簡潔にできる方法を教えて下さい。

追記

返事が遅くなってしまいましたが
回答してくださった方ありがとうございます。

コードは結局以下の形となりました(若干どこか間違っているかもしれませんが現状このような形です)
string.Join(",", sampleList.Where(!string.IsNullOrEmpty(No) && !string.IsNullOrEmpty(Name)).Select(sample => sample.No).ToArry());

Whereの条件にNoが数値(long型)かどうかのチェックを入れたいのですが
まだ試してはいませんがTryParseだとout値はいらないです、他に数値に変換できるかどうかの関数って存在するのでしょうか?
自分で作るしかないのでしょうか?

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

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

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

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

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

guest

回答7

0

string.Join() を調べて下さい。

投稿2017/05/06 07:15

Zuishin

総合スコア28660

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

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

Zuishin

2017/05/18 22:43

追記に対して Parse() を使い、例外を catch してください。
guest

0

こんにちは。

Sampleが入ったListなのでList<Sample>型のインスタンスに対する加工とします。

まず、ListからNoを抽出するにはLinqを使うと手っ取り早いです。

csharp

1sampleList.Select(sample => sample.No); // IEnumerable<string> ["2", "1", "3"]

次に、stringのストリームをカンマ区切りで結合するにはstring.Joinメソッドを使用します。

csharp

1string.Join(",", sampleList.Select(sample => sample.No)); // "2,1,3"

質問にあるような"やりたいこと"を、思いつく限り分解して考えることで、どういうキーワードで調べればいいのかが分かるようになってくると思います。

投稿2017/05/06 07:25

tamoto

総合スコア4103

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

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

0

Joinメソッドを利用すれば簡単に連結できます。
下記の例では、文字型の配列をカンマ区切りで連結せよというプログラムです。

どのようにインスタンスを保持しているか分かりませんが、
基本的にはJoinしたい繰り返し可能な型(配列型などforeachで回せるクラス)に、
値を格納した上で、Joinの第2引数に渡します。

基本的に、C#ではあれをしながらこれをやる(配列を回しながら連結する)という風にプログラムを書くより、あれをしてからこれをやる(配列を作ってから連結する)という風にプログラムを書くと綺麗になります。
この書き方を極めていくとラムダ式記法などにたどり着きます。
(はじめは、とっつきにくいので気が向いたらでいいと思います。)

お試しください。

string[] arr = new string[] { "1", "2", "3" }; //カンマで配列を連結する。 string result = string.Join(",", arr );

投稿2017/05/06 07:21

ikasoumen

総合スコア110

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

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

0

基本的には、tamatoさんと同様でstring.joinでやれば色んな意味で良いかと。

csharp

1var models = new List<SampleModel> 2{ 3 new SampleModel {No = "1", Name = "Demo1"}, 4 new SampleModel {No = "2", Name = "Demo2"}, 5 new SampleModel {No = "3", Name = "Demo3"}, 6}; 7 8var result = string.Join(",", models.Select(m => m.No));

ただ、このコードがいろんなところで登場するのであれば、IEnumerable<SampleModel> の振る舞いとして扱われてもいいかと思うので、そんなときは以下の拡張メソッドをどっかで用意してあげて、

csharp

1public static class SampleModelExtensions 2{ 3 //拡張メソッド名はとりあえすてきとーにつけましたが、振る舞いに合った名称を... 4 public static string GetNoCsv(this IEnumerable<SampleModel> models) => string.Join(",", models.Select(m => m.No)); 5}

以下の感じで使うことで、同じコードがクソのように濫用せずキレイに収まり、いい感じになると思います。

csharp

1var models = new List<SampleModel> 2{ 3 new SampleModel {No = "1", Name = "Demo1"}, 4 new SampleModel {No = "2", Name = "Demo2"}, 5 new SampleModel {No = "3", Name = "Demo3"}, 6}; 7 8var result = models.GetNoCsv();

(一応書いておくと、なんでも拡張メソッドすればいいという話ではないので、用途用法は考えて利用していくださいネ♪)

投稿2017/05/09 09:13

BEACHSIDE

総合スコア294

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

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

BEACHSIDE

2017/05/19 03:01

あ、longのチェック読み落としてました...
guest

0

こんなのは如何でしょう?

var sampleList = new List<Sample> { new Sample { No = "2", Name = "Jiro" }, new Sample { No = "1", Name = "Taro" }, new Sample { No = "3", Name = "Saburo" } }; var sampleNumbers = sampleList .Select(s => s.No) .Aggregate((l, r) => l + "," + r);

追記に対応しました。
Noが負であっても弾きます。

C#

1var sampleNumbers = sampleList 2 .Select(s => s.No) // No を抽出 3 .Where(n => n?.Any() == true) // No は null ではなく1桁以上 4 .Where(n => n.Length <= long.MaxValue.ToString().Length - 1) // long の正の最大桁数-1を超えない 5 .Where(n => !n.Where(c => c < '0' || c > '9').Any()) // [0-9] 以外の文字を含まない 6 .Aggregate((l, r) => l + "," + r);

投稿2017/05/06 08:38

編集2017/05/19 03:13
hihijiji

総合スコア4150

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

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

0

連結先のstringだかStrigBuilderだかに値を入れる際に、空だったらカンマを入れずに要素を追加するようにすればよいとおもう。

投稿2017/05/06 07:13

iwamoto_takaaki

総合スコア2883

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

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

0

ベストアンサー

Whereの条件にNoが数値(long型)かどうかのチェックを入れたいのですが

C#

1class Sample 2{ 3 public string No; 4 public string Name; 5} 6 7void Main() 8{ 9 var samples = new List<Sample> 10 { 11 new Sample { No = "2", Name = "Jiro" }, 12 new Sample { No = null, Name = null }, 13 new Sample { No = "A", Name = "A" }, 14 new Sample { No = "1", Name = "Taro" }, 15 new Sample { No = "3", Name = null }, 16 }; 17 18 Console.WriteLine(string.Join(",", samples 19 .Where(_ => !string.IsNullOrEmpty(_.No) && !string.IsNullOrEmpty(_.Name)) 20 .Where(_ => 21 { 22 long t; 23 return long.TryParse(_.No, out t); 24 }) 25 .Select(_ => _.No))); 26}

とか。

最近の C# なら

class Sample { public string No; public string Name; } void Main() { var samples = new List<Sample> { new Sample { No = "2", Name = "Jiro" }, new Sample { No = null, Name = null }, new Sample { No = "A", Name = "A" }, new Sample { No = "1", Name = "Taro" }, new Sample { No = "3", Name = null }, }; Console.WriteLine(string.Join(",", samples .Where(_ => !string.IsNullOrEmpty(_.No) && !string.IsNullOrEmpty(_.Name)) .Where(_ => long.TryParse(_.No, out var t)) .Select(_ => _.No))); }

投稿2017/05/18 15:57

hidori

総合スコア402

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問