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

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

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

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

LINQ

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

Q&A

解決済

2回答

1583閲覧

LINQで中身を編集して結果を出力したい

youth

総合スコア12

C#

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

LINQ

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

0グッド

0クリップ

投稿2018/12/21 09:04

前提・実現したいこと

こんにちは!
Windows10でVisual Studio2017Communityで、C#のコードを書いています。
LINQで中身を編集して結果を出力したいです。
いまはforeachしています。

該当のソースコード

C#

1 private void CheckData() 2 { 3 var members = new List<MemberModel>(); 4 var member = new MemberModel() 5 { 6 Id = 1, 7 Name = "youth", 8 LivingOverseas = 0 9 }; 10 members.Add(member); 11 12 var queryResult = members 13 .Where(m => m.Name== "youth"); 14 15 var QueryResult = queryResult.ToList(); 16 if (0 < QueryResult.Count()) 17 { 18 foreach (var item in queryResult) 19 item.LivingOverseas = 1; 20 } 21 }

試したこと

C#

1 2 var queryResultTest = members 3 .Where(m => m.Name == "youth") 4 .Select(m => m.LivingOverseas = 1) 5 .FirstOrDefault(); 6 7 //期待するqueryResult 8 //var member = new MemberModel() 9 //{ 10 // Id = 1, 11 // Name = "youth", 12 // LivingOverseas = 1 13 //};

よろしくお願いいたします。

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

Windows10 Home
Visual Studio 2017 Community

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

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

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

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

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

guest

回答2

0

ベストアンサー

「結果を出力したい」というのはどういった意味でしょうか?

Name"youth"のもののLivingOverseasを1にしたいということですか?

Linqじゃなくてもいいならこう

csharp

1members.ForEach(m => 2{ 3 if (m.Name == "youth") m.LivingOverseas = 1; 4};

インスタンスが変わってもいいなら

csharp

1var queryResult = members.Select(m => m.Name == "youth" ? new MemberModel() { ID = m.ID, Name = m.Name, LivingOverseas = 1 } : m);

投稿2018/12/21 09:40

runny_nose

総合スコア280

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

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

youth

2018/12/25 01:17

ありがとうございます。 結果を出力とは、queryResultのなかの、name="youth"の LivingOverseasを1にする、という意味でした。ご推察のとおりです。 Linqで、と書いたのは、foreachをなくしたい、という意識が強かったためで、LinqでなくてもOKそうです。 インスタンスが変わってもよいかもしれないので、2個目のコードもたいへん示唆に富んでいました。 どちらもイマジネーションと創造性にあふれるコードだと思います。 検証します。取り急ぎ。
youth

2018/12/25 01:41

(1)の.ForEachのほうは、LivingOverseasの値は変わるけど、youthだけを抜き出しはできないのでしょうか。 members.Where(m => m.Name == "youth").ToList().ForEach(m => { if (m.Name == "youth") m.LivingOrerSeas = 1; }); などとやってみましたが、値は変わるものの抜出ができず。
runny_nose

2018/12/25 02:42 編集

ForEach()は単に各要素を引数にとるAcionを実行するだけなので、抽出はできません。 事前に抽出しておくか、値を書き換えたあとで抽出するかになります。 (事前にwhereで絞り込む場合はif文は不要です) var queryResult = members.Where(m => m.Name == "youth"); queryResult.ToList().ForEach(m => { m.LivingOverseas = 1; }; もしくは、 members.ForEach(m => { if (m.Name == "youth") m.LivingOverseas = 1; }; var queryResult = members.Where(m => m.Name == "youth"); もしくは、 var queryResult = members.Where(m => m.Name == "youth") .Select(m => new MemberModel() { ID = m.ID, Name = m.Name, LivingOverseas = 1 });
runny_nose

2018/12/25 02:49

ちなみに、foreachをなくしたい、 という理由がLINQの遅延実行を生かしたい(列挙を防ぎたい)ということであった場合、 ForEachメソッドだろうと列挙されることは変わりありません。 (むしろcontinueやbreakができない、yield returnもできない、  デリゲート呼び出しによりforeachよりも若干コストがかかる、非同期処理を実行するばあい待機も例外の捕捉もできない、など、ワンライナーで書ける以外、デメリットしかありません。通常のforeachをお勧めします。)
youth

2018/12/25 04:02

ありがとうございます。foreachを使います。
guest

0

C#

1 var queryResult = members 2 .Where(m => m.Name == "youth") 3 .ToArray(); 4 Array.ForEach(queryResult, m => m.LivingOverseas = 1); 5 var queryResultTest = queryResult.FirstOrDefault();

投稿2018/12/21 09:20

x_x

総合スコア13749

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

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

youth

2018/12/21 09:29

ありがとうございます。 文はふたつにわけないとだめですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問