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

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

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

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

C#

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

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

Q&A

解決済

4回答

1711閲覧

LINQ 取得した値の変換方法について

abd1106

総合スコア12

.NET Core

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

C#

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

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

0グッド

0クリップ

投稿2021/10/29 11:02

編集2021/10/29 12:17

LINQで取得した値を置き換えたいです。

例えば、以下の例では、Addressが「青森、秋田、岩手ならば、北東北」、「山形、宮城ならば、南東北」に取得したAddressカラムの値を置き換えたいです。

何か良い方法がありましたら、ご教示いただけますと幸いです。

取得した値の変換イメージイメージ:
CompanyNm = "株式会社ABC", Address = "北海道"        CompanyNm = "株式会社ABC", Address = "北海道"
CompanyNm = "株式会社DEF", Address = "青森"         CompanyNm = "株式会社DEF", Address = "北東北"
CompanyNm = "株式会社GHI", Address = "秋田"     ⇒   CompanyNm = "株式会社GHI", Address = "北東北"
CompanyNm = "株式会社JKL", Address = "岩手"         CompanyNm = "株式会社JKL", Address = "北東北"
CompanyNm = "株式会社MNO", Address = "山形"         CompanyNm = "株式会社MNO", Address = "南東北"
CompanyNm = "株式会社PQR", Address = "宮城"         CompanyNm = "株式会社PQR", Address = "南東北"

C#

1using Microsoft.AspNetCore.Mvc; 2using QuickMaster.Models; 3using QuickMaster.Views; 4using System; 5using System.Collections.Generic; 6using System.Linq; 7using System.Web; 8using WebApplication1.Models; 9using System.IO; 10 11namespace WebApplication1.Controllers 12{ 13 public class HomeController : Controller 14 { 15 16 17 private readonly MyContext _context; 18 19 public HomeController(MyContext context) 20 { 21 this._context = context; 22 } 23 24 public ActionResult Index() 25 { 26 27 Trader[] traders = new Trader[] { 28 new Trader() { Id = 1, CompanyNm = "株式会社ABC", Address = "北海道" }, 29 new Trader() { Id = 2, CompanyNm = "株式会社DEF", Address = "青森" }, 30 new Trader() { Id = 3, CompanyNm = "株式会社GHI", Address = "秋田" }, 31 new Trader() { Id = 4, CompanyNm = "株式会社HIJ", Address = "岩手" }, 32 new Trader() { Id = 5, CompanyNm = "株式会社KLM", Address = "山形" }, 33 new Trader() { Id = 6, CompanyNm = "株式会社OPQ", Address = "宮城" }, 34 }; 35 36 return View(); 37 } 38 } 39}

環境は、.NetCore 3.1 でVisual Studio、C#を使用しております。
※本当はコントローラに書くのは良くないということは分かっていますが、動作確認が容易だと判断してあえてここに記載しています。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/10/29 11:19

ASP.NET の話なら ASP.NET のタグをつけて、何を作っているか(Web Forms? MVC? Razor? その他?)と 開発環境(OS. Visual Studio のバージョン、.NET か Core のどっちかとそのバージョンなど)を書いてください。
guest

回答4

0

ちなみに、regionのListを作らないで実現することはできないでしょうか。
例えば、クエリ式の中から、メソッドを呼んで、switch文で分岐処理をしたり、クエリ式のどこかで条件分岐できたりはできないという認識でよろしいでしょうか。
※クエリ式の中で、自作のメソッドを呼び出したり、if文で分岐できたら楽なのに・・と思っていたので、この質問をさせていただきました。

こういうことでしょうか?

lang

1using System; 2using System.Linq; 3 4namespace LinqSample { 5 class Program { 6 static void Main(string[] args) { 7 var traders = new Trader[] { 8 new Trader() { Id = 1, CompanyNm = "株式会社ABC", Address = "北海道" }, 9 new Trader() { Id = 2, CompanyNm = "株式会社DEF", Address = "青森" }, 10 new Trader() { Id = 3, CompanyNm = "株式会社GHI", Address = "秋田" }, 11 new Trader() { Id = 4, CompanyNm = "株式会社HIJ", Address = "岩手" }, 12 new Trader() { Id = 5, CompanyNm = "株式会社KLM", Address = "山形" }, 13 new Trader() { Id = 6, CompanyNm = "株式会社OPQ", Address = "宮城" }, 14 }; 15 16 var query = 17 from trader in traders 18 select new { 19 Id = trader.Id, 20 CompanyNm = trader.CompanyNm, 21 Address = new string[] { "青森", "秋田", "岩手" }.Contains(trader.Address) 22 ? "北東北" 23 : new string[] { "山形", "宮城" }.Contains(trader.Address) 24 ? "南東北" 25 : trader.Address 26 }; 27 28 var result = query.ToList(); 29 30 foreach (var o in result) { 31 Console.WriteLine($"Id={o.Id}, CompanyNm={o.CompanyNm}, Address={o.Address}"); 32 } 33 } 34 } 35 36 class Trader { 37 public int Id { get; set; } 38 public string CompanyNm { get; set; } 39 public string Address { get; set; } 40 } 41}

出力。

Id=1, CompanyNm=株式会社ABC, Address=北海道 Id=2, CompanyNm=株式会社DEF, Address=北東北 Id=3, CompanyNm=株式会社GHI, Address=北東北 Id=4, CompanyNm=株式会社HIJ, Address=北東北 Id=5, CompanyNm=株式会社KLM, Address=南東北 Id=6, CompanyNm=株式会社OPQ, Address=南東北

lang

1= new string[] { "青森", "秋田", "岩手" }.Contains(trader.Address) 2 ? "北東北" 3 : new string[] { "山形", "宮城" }.Contains(trader.Address) 4 ? "南東北" 5 : trader.Address

それが設計としてよいかどうかは別として、この部分をメソッドに切り出して呼び出すことも、できます。

投稿2021/10/29 16:26

jhashimoto

総合スコア838

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

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

abd1106

2021/10/30 02:10

ご回答いただき、ありがとうございました。 設計としては、あまりよくないんですね・・。 引き出しの一つとして、利用させていただこうと思います。 本当にありがとうございました。
jhashimoto

2021/10/30 03:51

> 設計としては、あまりよくないんですね・・。 「よくない」という意図はなかったです。あくまでもサンプルコードなので、これだけで良し悪しの判断はできないと思います。どのようなコードが要件に沿っているかご自身で検討してみてください。
abd1106

2021/10/30 10:23

ご回答いただき、ありがとうございました。
guest

0

ベストアンサー

別回答のコメント

逆にラムダ式を使わないと、実現はできないという認識でよろしいのでしょうか。

ちなみに、regionのListを作らないで実現することはできないでしょうか。

例えば、クエリ式の中から、メソッドを呼んで、switch文で分岐処理をしたり、クエリ式のどこかで条件分岐できたりはできないという認識でよろしいでしょうか。
※クエリ式の中で、自作のメソッドを呼び出したり、if文で分岐できたら楽なのに・・と思っていたので、この質問をさせていただきました。

を読んでそこまでクエリ式の中で分岐やりたいなら、単純にselect句で三項演算でもできるし(このやり方が良いとは欠片も思ってないけど)

cs

1var q = from trader in traders 2 select new 3 { 4 trader.Id, 5 trader.CompanyNm, 6 Address = new[] { "青森", "秋田", "岩手"}.Contains(trader.Address) ? "北東北" : new[] { "山形", "宮城" }.Contains(trader.Address) ? "南東北" : trader.Address 7 }; 8 9foreach (var o in q) 10{ 11 Console.WriteLine($"Id={o.Id}, CompanyNm={o.CompanyNm}, Address={o.Address}"); 12}

switchでもできる(switchじゃない)
ただしこれはC#のLangVersionが8.0以上じゃないとできないと思うけど。

cs

1var q = from trader in traders 2 select new 3 { 4 trader.Id, 5 trader.CompanyNm, 6 Address = trader.Address switch 7 { 8 "青森" => "北東北", 9 "秋田" => "北東北", 10 "岩手" => "北東北", 11 "山形" => "南東北", 12 "宮城" => "南東北", 13 _ => trader.Address, 14 }, 15 }; 16 17foreach (var o in q) 18{ 19 Console.WriteLine($"Id={o.Id}, CompanyNm={o.CompanyNm}, Address={o.Address}"); 20}

投稿2021/10/29 16:24

編集2021/10/29 16:26
gentaro

総合スコア8947

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

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

abd1106

2021/10/30 02:14 編集

ご回答いただき、ありがとうございました。 自分の中の引き出しの1つとさせていただきます。 ちなみに、gentaroさんなら、どういった書き方がベストだと思われますか。 よろしければ、理由も含めて教えていただけますと幸いです。
gentaro

2021/10/30 04:24

> クエリ式のどこかで条件分岐 という点について、それをやるのが良くないと思うという話ね。 条件分岐の部分についてメソッド抽出するなら良いんじゃない。
abd1106

2021/10/30 10:22

ご回答いただき、ありがとうございます。 実はメソッド抽出の方法は、検討致しました。ただ、どうやって、メソッドを呼び出して、値を設定すればいいのか・・?ということになってしまいました・・。 いろいろと試しましたが、以下の場合、 「匿名型のメンバー宣言子が無効です。メンバー代入、簡易名、またはメンバー アクセスを使用して、匿名型メンバーを宣言する必要があります。」 というエラーになってしまいます・・。 方法をご教示願えませんでしょうか。 例 using Microsoft.AspNetCore.Mvc; using QuickMaster.Models; using QuickMaster.Views; using System; using System.Collections.Generic; using System.Linq; using System.Web; using WebApplication1.Models; using System.IO; namespace WebApplication1.Controllers { public class HomeController : Controller { private readonly MyContext _context; public HomeController(MyContext context) { this._context = context; } public ActionResult Index() { Trader[] traders = new Trader[] { new Trader() { Id = 1, CompanyNm = "株式会社ABC", Address = "北海道" }, new Trader() { Id = 2, CompanyNm = "株式会社DEF", Address = "青森" }, new Trader() { Id = 3, CompanyNm = "株式会社GHI", Address = "秋田" }, new Trader() { Id = 4, CompanyNm = "株式会社HIJ", Address = "岩手" }, new Trader() { Id = 5, CompanyNm = "株式会社KLM", Address = "山形" }, new Trader() { Id = 6, CompanyNm = "株式会社OPQ", Address = "宮城" }, }; var query1 = from m in _context.Trader select new { m.Id, m.CompanyNm, m.Address = changeAddress(m.Address); }; return View(); } public string changeAddress(string args) { if (args == "青森" || args == "秋田" || args == "岩手") { args = "北東北"; } else if (args == "山形" || args == "宮城") { args = "南東北"; } return args; } }
gentaro

2021/10/30 11:53

✕m.Address = changeAddress(m.Address); ○Address = changeAddress(m.Address)
abd1106

2021/10/30 12:32

自分の理想の形になりました! ありがとうございました。
guest

0

こうですかね。

C#

1traders = traders.Select(t=>{ 2 if ((new string[] { "青森", "秋田", "岩手" }).Any(s=>s==t.Address)) { t.Address = "北東北"; } 3 if ((new string[] { "山形", "宮城" }).Any(s=>s==t.Address)) { t.Address = "南東北"; } 4 return t; 5}).ToArray();

投稿2021/10/29 14:14

ku__ra__ge

総合スコア4524

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

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

abd1106

2021/10/29 15:40

ご回答いただき、ありがとうございます。 確かに、これで実現できることを確認致しました。 ラムダ式を使えば、できるんですね。大変勉強になりました、ありがとうございました。 逆にラムダ式を使わないと、実現はできないという認識でよろしいのでしょうか。
guest

0

一案ですが、北東北/南東北を別のデータソースに持たせれば、結合できます。

lang

1using System; 2using System.Linq; 3 4namespace LinqSample { 5 class Program { 6 static void Main(string[] args) { 7 var traders = new Trader[] { 8 new Trader() { Id = 1, CompanyNm = "株式会社ABC", Address = "北海道" }, 9 new Trader() { Id = 2, CompanyNm = "株式会社DEF", Address = "青森" }, 10 new Trader() { Id = 3, CompanyNm = "株式会社GHI", Address = "秋田" }, 11 new Trader() { Id = 4, CompanyNm = "株式会社HIJ", Address = "岩手" }, 12 new Trader() { Id = 5, CompanyNm = "株式会社KLM", Address = "山形" }, 13 new Trader() { Id = 6, CompanyNm = "株式会社OPQ", Address = "宮城" }, 14 }; 15 16 var regions = new Region[] { 17 new Region() { Address = "青森", RegionName = "北東北" }, 18 new Region() { Address = "秋田", RegionName = "北東北" }, 19 new Region() { Address = "岩手", RegionName = "北東北" }, 20 new Region() { Address = "山形", RegionName = "南東北" }, 21 new Region() { Address = "宮城", RegionName = "南東北" } 22 }; 23 24 var query = 25 from t in traders 26 join r in regions 27 on t.Address equals r.Address into gj 28 from tr in gj.DefaultIfEmpty() 29 select new { 30 Id = t.Id, 31 CompanyNm = t.CompanyNm, 32 Address = tr?.RegionName ?? t.Address // Traderに結合されるRegionがない場合はAddressを返す 33 }; 34 35 var result = query.ToList(); 36 37 foreach (var o in result) { 38 Console.WriteLine($"Id={o.Id}, CompanyNm={o.CompanyNm}, Address={o.Address}"); 39 } 40 } 41 } 42 43 class Trader { 44 public int Id { get; set; } 45 public string CompanyNm { get; set; } 46 public string Address { get; set; } 47 } 48 49 class Region { 50 public string Address { get; set; } 51 public string RegionName { get; set; } 52 } 53}

出力。

Id=1, CompanyNm=株式会社ABC, Address=北海道 Id=2, CompanyNm=株式会社DEF, Address=北東北 Id=3, CompanyNm=株式会社GHI, Address=北東北 Id=4, CompanyNm=株式会社HIJ, Address=北東北 Id=5, CompanyNm=株式会社KLM, Address=南東北 Id=6, CompanyNm=株式会社OPQ, Address=南東北

投稿2021/10/29 14:46

jhashimoto

総合スコア838

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

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

abd1106

2021/10/29 15:38

ご回答いただき、ありがとうございます。 regionのListを作成して、joinするという選択肢がありませんでしたので、勉強になりました。 ちなみに、regionのListを作らないで実現することはできないでしょうか。 例えば、クエリ式の中から、メソッドを呼んで、switch文で分岐処理をしたり、クエリ式のどこかで条件分岐できたりはできないという認識でよろしいでしょうか。 ※クエリ式の中で、自作のメソッドを呼び出したり、if文で分岐できたら楽なのに・・と思っていたので、この質問をさせていただきました。
jhashimoto

2021/10/29 16:17

コードブロック使えないので、回答の方に書きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問