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

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

新規登録して質問してみよう
ただいま回答率
85.50%
.NET Core

.NET Coreは、マネージソフトウェアフレームワークでオープンソースで実装されています。クロスプラットフォームを前提に考えられており、Windows/Mac/Linuxで動くアプリケーションを作成することが可能です。

C#

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

Null

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

3780閲覧

配列内に空白(Null)があってもエラーを出さずに出力したい

Q10

総合スコア12

.NET Core

.NET Coreは、マネージソフトウェアフレームワークでオープンソースで実装されています。クロスプラットフォームを前提に考えられており、Windows/Mac/Linuxで動くアプリケーションを作成することが可能です。

C#

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

Null

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/08/25 02:58

編集2021/08/25 03:04

前提・実現したいこと

たとえ配列内のデータに空白(Null)があっても
エラーを出さずにNullのまま表示したいです。

データとしてはCSVを想定しています。

データが

1,1,\"{1,2,3}\"

の場合は出力が

1, 2, 3

となり、問題ありません。

ただ、データが

1,1,\"{,,}\"

のように空白が含まれているデータを読もうとして
double[]double?[]に、
double.Parsedouble?.Parseに変更すると、

Severity Code Description Project File Line Suppression State Error CS1525 Invalid expression term 'double' Nullable_Double_Array Program.cs 15 Active

というエラーが出ます。

期待している出力は

, ,

です。

このようにエラー無く、Null許容型で取得・表示するにはどうすればよいのでしょうか?

該当のソースコード

C#

1using System; 2using System.Text.RegularExpressions; 3 4namespace Nullable_Double_Array 5{ 6 class Program 7 { 8 static void Main(string[] args) 9 { 10 //var numbers = Regex.Match("1,1,\"{1,2,3}\"", @"\{(?<numbers>[-?\d+(.?\d+)?(E[+-]\d+)?,]+)\}").Groups["numbers"].Value; 11 //double[] test_ = Array.ConvertAll(numbers.Split(new[] { ',', }), double.Parse); 12 13 var numbers = Regex.Match("1,1,\"{,,}\"", @"\{(?<numbers>[-?\d+(.?\d+)?(E[+-]\d+)?,]+)\}").Groups["numbers"].Value; 14#nullable enable 15 double?[] test_ = Array.ConvertAll(numbers.Split(new[] { ',', }), double?.Parse); 16#nullable disable 17 Console.WriteLine($"{test_[0]}, {test_[1]}, {test_[2]}"); 18 } 19 } 20}

試したこと

Nullableを使用するため、

double[] test_ = Array.ConvertAll(numbers.Split(new[] { ',', }), double.Parse);    ↓ double?[] test_ = Array.ConvertAll(numbers.Split(new[] { ',', }), double?.Parse); ```に変更しました。 また、Nullableが使用可能なC# 8.0を選び、 ```ここに言語を入力 #nullable enable #nullable disable

で囲みました。

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

OS: Windows10
IDE: Visual Studio Community 2019
.NET Core: 3.1 (LTS)
C#: 8.0

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/08/25 03:32

> Nullableが使用可能なC# 8.0を選び、 それ思い違いです。#nullable enable というようにするのは null 許容参照型を使う場合。double は値型なので関係ないです。 > double?.Parse そんなのは無いのでは?
guest

回答2

0

Nullableが使用可能なC# 8.0を選び、

それ思い違いです。#nullable enable というようにするのは null 許容参照型を使う場合。double は値型なので関係ないです。

double?.Parse

そんなのは無いのでエラーになっているのでは?

他にもいろいろ問題はありそうですが、それはさておき、numbers に "1,2,3" とか ",," とか "1,,3" という文字列が取得できているなら、Linq を使って以下のようにしてはいかがですか?

using System; using System.Text.Json; using System.Linq; namespace ConsoleAppJson { class Program { static void Main(string[] args) { string[] strArray = new string[] { "1,2,3", ",,", "1,,3" }; foreach (string str in strArray) { double?[] test_ = str.Split(',') .Select(x => String.IsNullOrEmpty(x) ? null : (double?)double.Parse(x)) .ToArray(); Console.WriteLine($"{test_[0]}, {test_[1]}, {test_[2]}"); } } } }

結果は:

イメージ説明

投稿2021/08/25 04:22

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2021/08/25 06:19

誰、理由も書かないでマイナス評価を付けて卑怯者は?
Q10

2021/08/25 06:21

こちらの方法でも正しく変換できました。 Linqでも同様に処理できるんですね。 肝はNullかどうかを判断してdouble?に格納する、というところでしょうか。 Linqももっと勉強してみます。 あと、今までNULL許容値型とNULL許容参照型の違いすら知りませんでした。勉強になりました。 ありがとうございました!
Q10

2021/08/25 06:21

ちなみに、マイナス評価は私ではないですよ。
退会済みユーザー

退会済みユーザー

2021/08/25 06:38

> 肝はNullかどうかを判断してdouble?に格納する、というところでしょうか。 例えば "1,,3" を Split したならその結果の "1", "", "3" のそれぞれを IsNullOrEmpty メソッドでチェックし、「空白もしくは null」なら null を、そうでなければその文字列を Parse して double?[] 型の配列に代入しています。 文字列が Parse できないと例外がスローされますが、その対応は、その場合は null にしてよいのか、異常事態としてアプリを終わらせるのか、ユーザーに通知して対処を促すのかによって違ってきますので、ご自分で検討してみてください。
Q10

2021/08/25 07:02

なるほど、他にも応用が利きそうですね。 Linqを自由に使いこなせるようになりたいです。 文字列が Parse できない場合は今回はNullと考えていますが、 場合によっては異常事態として通知する仕組みも考えてみます。 ありがとうございました!
guest

0

ベストアンサー

Parseメソッドですと変換できないものはExceptionが発生します。
なので、TryParseを利用して変換できないものはnullとするような変換を行う必要があります。
ConvertAllを使用したいのであれば、下記のような変換用のメソッドを作成し利用するようにしてください。

サンプルソースですと、"+"や"E"といった指数表現に使う文字のみでも分割されるのでこういった場合にどうするのかなど求める仕様になるようにしてください。

C#

1static double? ConvertNullableDouble(string s) 2{ 3 return double.TryParse(s, out var d) ? (double?)d : null; 4} 5

投稿2021/08/25 03:56

YAmaGNZ

総合スコア10222

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

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

Q10

2021/08/25 05:52

ベストアンサーです。 ちゃんと変換できました。 なるほど、関数にしてTryParseを使うんですね。 ConvertAllの使い方もこれでやっと理解しました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問