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

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

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

Listオブジェクトに格納されたDataオブジェクトの削除

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

■83220 / inTopicNo.1)  Listオブジェクトに格納されたDataオブジェクトの削除
  
□投稿者/ rotto (5回)-(2017/03/13(Mon) 17:40:51)

分類:[C#] 

いつもお世話になっております
Listについて質問させてください

例えば、下記のようなコードがあります。

Dataクラスの構造は下記の通りです

public class Data
{
public string Hiduke { get; set; }
public int ID { get; set; }
public string NAME { get; set; }
}

【コード】
List<Data> list_data = new List<Data>();
list_data.Add(new Data(){Hiduke = "20170312",ID = 05,NAME = "TAROU"});
list_data.Add(new Data(){Hiduke = "20170309",ID = 06,NAME = "KANA"});
list_data.Add(new Data(){Hiduke = "20170316",ID = 09,NAME = "TOSIHISA"});

このように3件のData型のオブジェクトが
Listオブジェクトに格納されています。

【質問01】
Listオブジェクトに格納された中で、最も古い日付が含まれる
Data型オブジェクトを削除したいのですが
コードでどのように書けばよいのでしょうか?

【質問02】
Listオブジェクトに格納された中で、最も古い日付のみを
削除する場合は、どのようにコードで書けばよいのでしょうか?

上記2点が知りたいです
回答、よろしくお願いします。


引用返信 編集キー/
■83229 / inTopicNo.2)  Re[1]: Listオブジェクトに格納されたDataオブジェクトの削除
□投稿者/ 魔界の仮面弁士 (1180回)-(2017/03/14(Tue) 03:32:41)
No83220 (rotto さん) に返信
> 【質問01】
> Listオブジェクトに格納された中で、最も古い日付が含まれる
> Data型オブジェクトを削除したいのですが
> コードでどのように書けばよいのでしょうか?

たとえば
 list_data.Remove(list_data.OrderBy(_ => _.Hiduke).First());
のように書けます。これにより最古の 1 件が削除されます。

この方法では常に「1 件」を削除しようとするため、元のデータが 3 件ではなく
0 件であった場合は失敗します。元データが存在するかどうか、
if(list_data.Any()) { } などで事前チェックを行ってください。


また、「最古の日付」を持つ Data が複数存在した場合には、
削除候補レコードが複数件存在することになります。
そのような場合は、下記のように書くことできます。

 string min = list_data.Min(_ => _.Hiduke);
 for (int i = list_data.Count - 1; i >= 0; i--)
 {
  if(list_data[i].Hiduke == min)
  {
   list_data.RemoveAt(i);
  }
 }



> 【質問02】
> Listオブジェクトに格納された中で、最も古い日付のみを
> 削除する場合は、どのようにコードで書けばよいのでしょうか?

質問01 との違いが分からないのですが、先に書いたように
 Data oldData = list_data.OrderBy(_ => _.Hiduke).First();
で最古の日付を持つ Data が手に入ります(日付は oldData.Hiduke)ので、
それを削除すれば良いかと。
引用返信 編集キー/
■83230 / inTopicNo.3)  Re[2]: Listオブジェクトに格納されたDataオブジェクトの削除
□投稿者/ Azulean (792回)-(2017/03/14(Tue) 06:58:45)
No83229 (魔界の仮面弁士 さん) に返信
> 質問01 との違いが分からないのですが、先に書いたように

「Data 型のオブジェクト」というキーワードがないことから、日付を直接 List に入れた場合かな?
それで合っているのであれば、list_data.Remove(list_data.OrderBy(_ => _).First()); や list_data.Min(_ => _); というように OrderBy や Min の部分を加工すれば良いと思います。
引用返信 編集キー/
■83231 / inTopicNo.4)  Re[3]: Listオブジェクトに格納されたDataオブジェクトの削除
□投稿者/ 魔界の仮面弁士 (1181回)-(2017/03/14(Tue) 07:07:05)
No83230 (Azulean さん) に返信
> 「Data 型のオブジェクト」というキーワードがないことから、日付を直接 List に入れた場合かな?
> それで合っているのであれば、list_data.Remove(list_data.OrderBy(_ => _).First()); や list_data.Min(_ => _); というように OrderBy や Min の部分を加工すれば良いと思います。

補足ありがとうございます。

List<DateTime> や List<string> の場合には
list_data.Min(_ => _) の代わりに
list_data.Min() でも良いですね。

var old = list_data.Min();
list_data.Remove(old);
引用返信 編集キー/
■83248 / inTopicNo.5)  Re[4]: Listオブジェクトに格納されたDataオブジェクトの削除
□投稿者/ rotto (6回)-(2017/03/15(Wed) 00:23:23)
なるほど、とてもよく分かりました
みなさん、分かりやすい解説どうもありがとうございます。

ちなみに
【質問02】
Listオブジェクトに格納された中で、最も古い日付のみを
削除する場合は、どのようにコードで書けばよいのでしょうか?

ですが、分かりづらく申し訳ありません。

これは日付を削除するというよりは、ただ単に古い日付の場所に
nullを格納する処理を行いたかっただけです。

list_data.Add(new Data(){Hiduke = "20170312",ID = 05,NAME = "TAROU"});
list_data.Add(new Data(){Hiduke = "20170309",ID = 06,NAME = "KANA"});
list_data.Add(new Data(){Hiduke = "20170316",ID = 09,NAME = "TOSIHISA"});
とあった場合は

list_data[1].Hiduke に nullを格納できればそれでよかったです。

しかし、みなさんの解説で、やり方は分かったので問題ありません。
ありがとうございます

引用返信 編集キー/
■83249 / inTopicNo.6)  Re[5]: Listオブジェクトに格納されたDataオブジェクトの削除
□投稿者/ rotto (7回)-(2017/03/15(Wed) 01:50:40)
解決済みのチェックを入れ忘れていましたので
チェックさせていただきます。
解決済み
引用返信 編集キー/

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


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

このトピックに書きこむ