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

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

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

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

MVVM

MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

Q&A

解決済

2回答

4561閲覧

[MVVM] Listの中身の複製方法

kuniyan

総合スコア13

C#

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

MVVM

MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

0グッド

0クリップ

投稿2019/01/10 05:38

編集2019/01/10 06:44

WPFにて以下の2種類のListを持ちたいと考えています。

  1. SQLiteより取得した元のデータ
  2. 1.にて取得したデータをフィルターしたデータ (列はそのまま) => フィルターされた内容をDataGridで表示したい。

現在、SQLiteより取得し、データをList(ReactiveCollection)を使用し格納クラスで保持しています。
(うまい言い方が分からず申し訳ありません。)

C#

1 // 格納クラス1 (元) 2 class Test 3 { 4 public DateTime A { get; set; } 5 public int B { get; set; } 6 public int C { get; set; } 7 public string D { get; set; } 8 public string E { get; set; } 9 } 10 11 12 class MainWindowModel 13 { 14 public ReactiveCollection<Test> data { get; } = new ReactiveCollection<Test>(); 15 16 private SQLiteConnectionStringBuilder config { get; } = new SQLiteConnectionStringBuilder 17 { 18 DataSource = @"c:\temp\Test.db" 19 }; 20 21 public void getTestData() 22 { 23 using (var connection = new SQLiteConnection(config.ToString())) 24 { 25 var sql = @"SELECT A, B, C, D, E FROM 'x'"; 26 27 connection.Open(); 28 var result = connection.Query<Test>(sql).ToList(); 29 result.ForEach(x => data.Add(x)); 30 } 31 } 32 }

上記で作成したListをフィルターしその結果を、別のReactiveCollection(使用する保持クラスはTestとまったく同じ)に格納したいです。
(data に上書きしたくない)

C#

1 // 格納クラス2 (フィルター) 2 class Test2 3 { 4 public DateTime A { get; set; } 5 public int B { get; set; } 6 public int C { get; set; } 7 public string D { get; set; } 8 public string E { get; set; } 9 } 10 11 class MainWindowViewModel 12 { 13 public ReactiveCollection<Test2> test2 { get; } = new ReactiveCollection<Test2>(); 14 15 private MainWindowModel model { get; } = new MainWindowModel(); 16 17     publicMainWindowViewModel() 18 { 19 model.getTestData(); 20 21 // フィルター 22 var list = model.data.Where(x => x.A.Date > DateTime.Today.AddMonths(-2)) 23 .OrderBy(x => x.A); 24 } 25 } 26

単純にフィルターの後に以下のように書いてみましたが、案の定 匿名型から型変換はできませんでした。(そもそも不可能??)

C#

1 list.ToList().ForEach(x => test2.Add(x));

こんなことをする前に、もっと上手いことフィルター等ができそうな気がしますが、、、

基本すら曖昧でうまく説明できず申し訳ないのですが、なにか良い方法があればご教示いただければ幸いです。

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

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

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

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

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

papinianus

2019/01/10 06:01

「匿名型から型変換はできませんでした」とはどういうエラーですか?ForEachの中のxはTest型だと推論できそうなので、ぱっと見できそうなんですが。
kuniyan

2019/01/10 06:22

対応ありがとうございます。 エラーの内容は以下の通りです。 「引数 1: は'<anonymous type: System.DateTime A, int B, int C, string D, string E>' から 'App.Test2' へ変換することはできません。」 以上、よろしくお願いいたします。
YAmaGNZ

2019/01/10 06:29

Test2クラスが記載されているのに使われていないので気になったのですが、 public ReactiveCollection<Test> test2 { get; } = new ReactiveCollection<Test>(); が public ReactiveCollection<Test2> test2 { get; } = new ReactiveCollection<Test2>(); だったりしませんか?
kuniyan

2019/01/10 06:34

申し訳ありません。 記載ミスです。 実際のコードは、 public ReactiveCollection<Test2> test2 { get; } = new ReactiveCollection<Test2>(); となっています。
papinianus

2019/01/10 06:52

ありがとうございます。確かに匿名型ですね。なぜこれで匿名型になるのか私には理解が及びませんでした。
papinianus

2019/01/10 06:58

それはそうと、test2が何回もwhereしたくない、という意味の複製ならいいんですが、おそらく参照を持っているので、test2で値をかえると、modelのdataもかきかわるのではないかと思います(複製、と書いていたので念の為)
kuniyan

2019/01/10 07:36

test2 はに関しては、仰る通りwhereを複数回したくない為です。 値の書き換えは考えていないので、大丈夫です。
guest

回答2

0

ベストアンサー

CollectionViewSourceを使うとフィルタ以外にも並べ替えやグループングが簡単に行えます。
ReactivePropertyの中の人のページです。
1つのコレクションをCollectionViewSourceを使って2つのListBoxに異なる内容を表示する方法

リンク先では同じWindowに2つのListBoxを置いていますが、
元のコレクションのインスタンスが同じなら、別のWindowでも同じようにできます。

投稿2019/01/10 07:54

hihijiji

総合スコア4150

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

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

kuniyan

2019/01/10 09:10

実際に使ってみました。 今まで悩んでいたのがおかしいほど、簡単にフィルターできますね! 教えていただきありがとうございました。
guest

0

C#

1list.ToList().ForEach(x => test2.Add(x));

これにて、匿名型(実際はTestクラス)からTest2クラスへの変換が行われます。
コード上はTestクラスとTest2クラスは何の関係もないため、変換することは出来ません。

思いつきで書くものじゃないですね。
とりあえず、コードを書いてみたのですが、Testクラスと認識され、匿名型と判断されませんでいた。
test2.Add(x)xがTestからTest2へ変換することができませんとコンパイルエラーとなり、匿名型からの変換のエラーとはなりませんでした。

同じ内容のレコードを保持するのですから、わざわざTest2クラスを定義するのではなく、誤記の通り

C#

1public ReactiveCollection<Test> test2 { get; } = new ReactiveCollection<Test>();

でいいように思います。

投稿2019/01/10 06:42

編集2019/01/10 07:58
YAmaGNZ

総合スコア10258

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

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

kuniyan

2019/01/10 09:01

確認していただきありがとうございます。 匿名型からの変換エラーとはならないのですね。 自分でも、匿名型になる意味が理解できません。 何かやらかしてないか確認してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問