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

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

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

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

LINQ

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

Q&A

解決済

1回答

1767閲覧

C# Linqの使い方

takagi.1994

総合スコア47

C#

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

LINQ

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

0グッド

1クリップ

投稿2017/06/30 07:45

編集2017/06/30 11:12
person { stringid { get; set; } string name { get; set; } DateTime birthday { get; set; } int sex { get; set; } string pairid { get; set; } } List<person> obj = new List<person>(); obj.Add(new person {....});

sexには1=男,2=女
pairidにはsexが1の場合は2のどれか
2の場合は1のどれか
つまりカップルとしてペアリングされていて
pairidがない場合はフリーというようなデータが入ったobjがあり、
pairidがnullではない場合(つまりカップルとなっている)にカップルの誕生日が若い方に対してoderbyしたlistを取得したい。

var a = obj.Where(r=> r.sex == 1).Orderby(下記条件).ToList(); orderbyの条件 foreach(person p1 in obj) { if (p1.pairid != null) { foreach(person p2 in obj) { if (p1.pairid == p2.id) { if (p1.birthday.CompareTo(p2.birtday)) { p1.birthday } else { p2.birthday } } } } }

var a にはpersonのプロパティに加え、p2.birthdayが条件の対象となった場合に追加されたListとしたい。

ちなみに var aとなってるところの型は正しくはどうなるのでしょうか?
型でvarの使い方がいまいち理解できていません。

どうぞよろしくお願いします。

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

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

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

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

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

tamoto

2017/06/30 08:29

「一発でとる」「joinしてbirthdayを比較して新しいほう」と言ってますが、最終的に「どのようなデータ集合を取得したいのか」が明記されていないので、回答が難しいです。
kiichi54321

2017/06/30 08:40

何と比較するのかよくわからないので、何がしたいのか日本語として意味がわかりません。
退会済みユーザー

退会済みユーザー

2017/06/30 08:51

一度 https://teratail.com/help/question-tips を読んでみることをお勧めします。そこにも書いてありますが、"人に質問をするには、自分が何を尋ねたいかを知っている必要があります。これは、「自分が今『何がわからないのか』がわかっていて、言語化できている」ということです" が十分にできておらす、今は "何がわからないかわからない人から質問を受けても、答える側も困ってしまいます" という状況です。「一発」ってなんなのかわかりませんが、質問者さんが二発、三発で取れるならそのコードをアップして、それをどうしたいのか書くというような配慮が必要です。
ebiryo

2017/06/30 09:51

カップルを対象にペアの若いほうを取り出し、取り出したものを若い順に並べる、これをメソッドチェーンを使って行う ってことですかね? 回答より何を言ってるのか理解するほうが難しいです。 
takagi.1994

2017/06/30 10:04

pairにはidが入っている。idは一意の値である。ほしい情報は上記のプロパティとさらにpairidに入っているidに紐づくプロパティです。 ebiryoさんが言われてることです
ebiryo

2017/06/30 10:39

「pairにはidが入っている。idは一意の値」 などは皆さんわかってらっしゃると思いますよ。もし私の言っていることが正しいのであれば、質問を書き直してはいかがでしょうか。
skitoy4321

2017/07/06 08:20

サンプルデータを用意して、ソート前の値と期待するソート後の値を書いた方がわかりやすいと思います。
guest

回答1

0

ベストアンサー

誕生日が新しい方をキーとして「古い順番にソート」なんでしょうか・・・そうだとすれば

(1)ペアのうち男女両方を残すなら

c#

1List<person> list = new List<person>(); 2list.Add(new person {....}); 3... 4var result = list 5 .Where(p => p.pairid != null) 6 .OrderBy(p => { 7 var o = list.Find(p2 => p2.id == p.pairid); 8 return p.birthday > o.birthday ? p.birthday : o.birthday; 9 }) 10 .ToList();

(2)ペアのうち誕生日が古い方を除外(同一なら除外しない)

c#

1var result = list 2 .Where(p => p.pairid != null) 3 .Where(p => { 4 var o = list.Find(p2 => p2.id == p.pairid); 5 return p.birthday > o.birthday; 6 }) 7 .OrderBy(p => p.birthday) 8 .ToList();

ただし、(1)の方は、ソート中にキーを参照する度にFindでペア相手を検索するのは効率が悪そうなのでそれに配慮すると

(3) (1)の改良

C#

1var result = list 2 .Where(p => p.pairid != null) 3 .Select(p => { 4 var o = list.Find(p2 => p2.id == p.pairid); 5 var k = p.birthday > o.birthday ? p.birthday : o.birthday; 6 return new { Key = k, Value = p }; 7 }) 8 .OrderBy(kv => kv.Key) 9 .Select(kv => kv.Value) 10 .ToList();

さらに、順サーチではなくハッシュテーブルによる検索とするなら

(4) Dictionaryを使う

C#

1var dictionary = list.ToDictionary(p => p.id); 2var result = list 3 .Where(p => p.pairid != null) 4 .Select(p => { 5 var o = dictionary[p.pairid]; 6 var k = p.birthday > o.birthday ? p.birthday : o.birthday; 7 return new { Key = k, Value = p }; 8 }) 9 .OrderBy(kv => kv.Key) 10 .Select(kv => kv.Value) 11 .ToList();

型でvarの使い方がいまいち理解できていません。

varの使い方ではなくて代入文の右辺にある「Linqのメソッドの結果の型がよくわからない」ということではないでしょうか。Linqのメソッドの各々のリファレンスを熟読するなりLinqの解説ページを研究するなりして、各々のメソッドがIEnumerable<T>に対して、何を引数にしてどういう操作を行い結果をどういう形で後段のパイプラインへ渡すのかを覚えてしまいましょう。Linqのメソッドは一見多いように見えますが、オーバーロードによって数が膨らんでいるように見えるだけで、本質的にはそれほど多くのパターンはないように思います。
またVisualStudioで変数名のところへマウスをホバーするとツールチップで型を確認できるので活用してみてください。

投稿2017/06/30 14:58

KSwordOfHaste

総合スコア18394

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問