C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

DataTableとの差分比較をしたい

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■87816 / inTopicNo.1)  DataTableとの差分比較をしたい
  
□投稿者/ MTK (71回)-(2018/07/02(Mon) 15:44:18)

分類:[C#] 

Visual Studio 2015
.NET Framework 4.5.2


お世話になります。

データベースにINT型でC_Yearというカラムがあります。
C#のプログラム上で下記のSQLを発行し、C_Yearの一覧を取得し、DataTable型の retTable という変数に格納しています。

select C_Year
from tbCorpYear;



ここからが本題なのですが、この取得したC_Yearの一覧と、プログラム上で宣言している

List<string> payrollYear

との差分を出したいです。


例えば
C_Yearの一覧    → 2015,2016,2018
payrollYearの一覧 → 2016,2017
の場合だと

2018 のみを取得(C_Yearにあって、payrollYearにないものだけ)したいです。


試してみたことはLINQを使って

var items = retTable.AsEnumerable()
      .Except(payrollYear);

のようにしてみたのですが、『IQueryable<string>型のレシーバが必要です』 のようなエラーが出てきてしまい、行き詰まっております。
このエラーの意味や、比較する方法について教えていただけないでしょうか。
引用返信 編集キー/
■87817 / inTopicNo.2)  Re[1]: DataTableとの差分比較をしたい
□投稿者/ 魔界の仮面弁士 (1734回)-(2018/07/02(Mon) 16:06:58)
No87816 (MTK さん) に返信
> データベースにINT型でC_Yearというカラムがあります。

それを受け取る DataTable 側の C_Year フィールドの型は
int ですか? decimal ですか? string ですか?


> List<string> payrollYear
こちらは string なのですね。
比較の際には、DataTable と List の双方の型を合わせる必要があるでしょう。


> C_Yearの一覧    → 2015,2016,2018
> payrollYearの一覧 → 2016,2017
> の場合だと
> 2018 のみを取得(C_Yearにあって、payrollYearにないものだけ)したいです。

2015 が除去される理由は何でしょうか?


var retTable = new DataTable("retTable");
retTable.Columns.Add("C_Year", typeof(int));
retTable.Rows.Add(2015);
retTable.Rows.Add(2016);
retTable.Rows.Add(2018);

var payrollYear = new List<string>() { "2016", "2017" };

var cYears = retTable.AsEnumerable().Select(r => r["C_Year"].ToString());

string[] except = cYears.Except(payrollYear).ToArray();
引用返信 編集キー/
■87819 / inTopicNo.3)  Re[2]: DataTableとの差分比較をしたい
□投稿者/ MTK (72回)-(2018/07/02(Mon) 16:38:17)
2018/07/02(Mon) 16:40:00 編集(投稿者)

No87817 (魔界の仮面弁士 さん) に返信

ご回答ありがとうございます。


> それを受け取る DataTable 側の C_Year フィールドの型は
> int ですか? decimal ですか? string ですか?

int型でした。
その辺りも意識しないといけませんね。


>>List<string> payrollYear
> こちらは string なのですね。
> 比較の際には、DataTable と List の双方の型を合わせる必要があるでしょう。

はい、stringで管理しています。
今回、恐らく型が合っていないためにこのようなエラーが出ているということですね。


> 2015 が除去される理由は何でしょうか?

すいません、2015も抽出されるのが正しいです。


> var retTable = new DataTable("retTable");
> retTable.Columns.Add("C_Year", typeof(int));
> retTable.Rows.Add(2015);
> retTable.Rows.Add(2016);
> retTable.Rows.Add(2018);
>
> var payrollYear = new List<string>() { "2016", "2017" };
>
> var cYears = retTable.AsEnumerable().Select(r => r["C_Year"].ToString());
>
> string[] except = cYears.Except(payrollYear).ToArray();

ありがとうございます!
無事に比較することができました。

.Select(r => r["C_Year"].ToString())
のようにすれば C_Year のカラムをStringの一覧にできるのですね。
ありがとうございました。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ