前提・実現したいこと
LINQのorderbyメソッドを用いてデータを昇順で並び替えをすると空要素(Null/empty)が先頭にきます。
空要素を後ろに配置するように昇順で並び替えたいです。
List型ではうまくいきましたが、datarow型でのラムダ式の記述でつまづいてしまったため質問させていただきました。
発生している問題・エラーメッセージ
'Datarow'から'string'へ変換することはできません
該当のソースコード
C#
1 DataTable dt = new DataTable(); 2 dt.Columns.Add("No", typeof(int)); 3 dt.Columns.Add("Name", typeof(string)); 4 5 dt.Rows.Add(1,"B"); 6 dt.Rows.Add(2,""); 7 dt.Rows.Add(3,"C"); 8 dt.Rows.Add(4,"A"); 9 10 DataRow[] rows = dt.AsEnumerable() 11 .OrderByDescending(x => !string.IsNullOrEmpty(x)["Name"])//構文エラー 12 .ThenBy(x => x) 13 .ToArray(); 14 DataTable dt2 = rows.CopyToDataTable();
試したこと
Listでの並び替え
C#
1 var lst = new List<string>() { "B", null, "C","A" }; 2 3 var orderbylst = lst.OrderBy(x => x); //null,"A","B","C" 4 var orderbylst2 = lst.OrderByDescending(x => (!string.IsNullOrEmpty(x));//"B","C","A",null 5 var orderbylst3 = lst.OrderByDescending(x => !string.IsNullOrEmpty(x)) 6 .ThenBy(x => x);//"A","B","C",null
DataRowは"No"と"Name"のカラムが2つありますが、ソートの際は"No"は問わないのでしょうか。
例えば{{No=1, Name=""}, {No=2, Name=""}}のような場合、どうなることを想定していますか。
質問ありがとうございます。
カラム"No"に対する記述がなくて申し訳ありません。
"Name"で空要素が複数ある場合は、その中で"No"での昇順になることを想定しています。
{No=1, Name=""}、{No=2, Name=""}、{No=3, Name="C"}、{No=4, Name="A"}
⇓
{No=4, Name="A"}、{No=3, Name="C"}、{No=1, Name=""}、{No=2, Name=""}
> .OrderByDescending(x => !string.IsNullOrEmpty(x)["Name"])//構文エラー
エラーメッセージは string.IsNullOrEmpty(x) の引数 x の型が DataRow だからダメだと言っているのですよね? であれば、 !string.IsNullOrEmpty(x)["Name"] に代えて !string.IsNullOrEmpty(x.Field<string>("Name")) としてみたらどうなりますか?
{No=4, Name="A"}, {No=5, Name="A"} のときも昇順でしょうか
.ThenBy(x => x) ←やってみましたが、これもダメでした。回答欄に書いておきます。
まず OrderBy で空白を後にし、ThenBy で昇順に並べ替えると良いと思います。
SurferOnWwwさん
質問ありがとうございます。
DataRow[] rows = dt.AsEnumerable()
.OrderByDescending(x => !string.IsNullOrEmpty(x.Field<string>("Name")))
.ThenBy(x => x)
.ToArray();
上記で実装してみたところ
System.ArgumentException: '少なくとも 1 つのオブジェクトで IComparable を実装しなければなりません。'
となりました。
<参考>
https://www.webdevqa.jp.net/ja/c%23/%E5%B0%91%E3%81%AA%E3%81%8F%E3%81%A8%E3%82%821%E3%81%A4%E3%81%AE%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%8Cicomparable%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%99%E3%82%8B%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99/972695140/
私自身仕組みの理解が追い付いていませんが、
キャストの方法が理解できていなかったため、非常に助かりました。
ありがとうございます。
追記
.ThenBy(x => x.Field<string>("Name"))の修正で対応できました。
ありがとうございます。
回答欄を見てください。そこのところも解決しました。
回答3件
あなたの回答
tips
プレビュー