プロが教える店舗&オフィスのセキュリティ対策術

class A
{
public string dt;
public int i;
}
List<A> rows = new List<A>()
{
{ new A(){ dt = "2022-12-25 07:00:00", i = 10 } },
{ new A(){ dt = "2022-12-24 00:00:00", i = 20 } },
{ new A(){ dt = "2022-12-25 01:00:00", i = 15 } },
{ new A(){ dt = "2022-12-24 00:00:00", i = 50 } },
{ new A(){ dt = "2022-12-23 04:00:00", i = 100 } },
};
という中身がクラスAの配列があって、

・クラスAのdtを時間とみなして時刻を基準に昇順に並べ替える
・dtが重複する行は後の行を削除する

この2つの条件で並べ替えをしたいです。この例だと

{ new A(){ dt = "2022-12-23 04:00:00", i = 100 } },
{ new A(){ dt = "2022-12-24 00:00:00", i = 20 } },
{ new A(){ dt = "2022-12-25 01:00:00", i = 15 } },
{ new A(){ dt = "2022-12-25 07:00:00", i = 10 } },

という結果が得たいのですが、よろしくお願いします。

A 回答 (5件)

C# のお話ならば LINQ を使うことになるかと思います



並び替え
https://learn.microsoft.com/ja-jp/dotnet/api/sys …

重複削除
https://learn.microsoft.com/ja-jp/dotnet/api/sys …
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
そのサイトを参考にできました!

class A
{
public string dt;
public int i;
}
List<A> rows = new List<A>()
{
{ new A(){ dt = "2022-12-25 07:00:00", i = 10 } },
{ new A(){ dt = "2022-12-24 00:00:00", i = 20 } },
{ new A(){ dt = "2022-12-25 01:00:00", i = 15 } },
{ new A(){ dt = "2022-12-24 00:00:00", i = 50 } },
{ new A(){ dt = "2022-12-23 04:00:00", i = 100 } },
};

foreach (A a in rows.OrderBy(row => row.dt).DistinctBy(row => row.dt))
{
Console.WriteLine(str)(a.dt + " " + a.i.ToString());
}

なるほど、たしかにそのLINQというのを知ってればあっさりできますね(^^;

お礼日時:2022/12/26 15:23

一般に「並べ替え」というと「データの個数は変えずに位置のみを変える」ってことになるから, 「dtが重複する行は後の行を削除する」は「並べ替え」とは別に処理するのがふつうだろう.



で「クラスAのdtを時間とみなして時刻を基準に昇順に並べ替える」はまあなんかの sort メソッドを使うんだろうねぇ.... 今の要求だと「元のリストにおける順序」が必要だから安定なアルゴリズムが必要なんだけど, そんなの C# にあるかなぁ. なんか検索したら「自分で作れ」的なのが見付かったんだけど.

で, 並べ替えれば「dtが重複する行」は前後に並ぶから, 後ろにあるやつを削っていく.
    • good
    • 0

N0.1です、


開発環境が違ってごめんなさい。
>あとこれは重複行の削除はできているのでしょうか?・・・
重複する複数行はそのままです、同順位でソートされます。
配列の中身は手をつけません。
    • good
    • 0
この回答へのお礼

ご返信ありがとうございます。
いえいえ、具体的なコードを提示して頂けただけでもありがたいです。
(ただC#だったら良かったなぁ(^^;)

お礼日時:2022/12/26 15:19

楽なのは、「クラスAの順番を判定する方法を用意して、Sortメソッドで並び換える」でしょう。



https://www.sejuku.net/blog/40456
    • good
    • 0

VC++の開発環境ですが・・・



ソート関数
extern "C" int comp(const void *a, const void *b)//CompSW = 順番or順番DIR
{
return strcmp( ( char*)b, ( char*)a ) ;//昇順
return strcmp( ( char*)a, ( char*)b ) ;//降順
}

これで呼び出す。
qsort( ( void * )StringList, List_行数, 一行文字数, comp);

StringListは準備が必要です。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
プログラムを提示してありがたいのですが、
ちょっとVC++だと自分は分からないです・・・(^^;
たしかにアルゴリズム的なことを知れてC#で応用できれば
それで問題ないかもしれませんが、並べ替えに関しては
結構C#特有の記述の仕方がありそうな気がしてまして、どうなんでしょう。
あとこれは重複行の削除はできているのでしょうか?

お礼日時:2022/12/25 18:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!