2017-04-14 28 views
-4

ソートされたリストには何千ものレコードがあります。 彼らは形式である:文字列の比較C#

public static string mTimeFormat = "yyyyMMdd_HHmmss_fff"; 

リストは時間順にソートされます。 リストからレコードの範囲を取得します。私は、時間レコードの終わりに乱数を付加した場合、私の比較/検索はまだ動作しますが、今...

string t1 = startTime.ToString(mTimeFormat); 
string t2 = endTime.ToString(mTimeFormat); 
List<string> results = fileNameList.FindAll(s => (String.Compare(s, t1, true) > 0) && (String.Compare(s, t2, true) < 0)); 

T1とT2とそれが正常に動作します...:結果の範囲が2倍の間にあります私は文字列の比較について知っていることに基づいて比較を中断します...それは?

+5

um ...テストケースにいくつか追加して、これを自分で把握することはできません。テスト版のアプリとテストデータはありませんか?あなたは実際に投稿する前に自分自身を考え出すために何らかの努力を払うことを学ぶべきです。あなたのインターネット接続がダウンするとどうなりますか?戻ってくるまで座って親指をひねりますか? –

+0

ああ、人類!'DateTime'sを文字列に変換することを比較することは、危険を伴います。 'DateTime'構造体は直接比較可能です。 MSDNのドキュメントをお読みください。 – radarbob

答えて

1

もう一度試してみましょう。直接MSDNから:2つの文字列が1つの文字列の末尾に等しく、比較、およびその他の文字列が残りの文字を持っている場合

、その後、残りの文字と文字列は、あなたの最初の、したがって大きい

と考えられていますst1よりも長く、残りの文字が同じ場合、比較(String.Compare(s, t1, true) > 0)はtrueを返します。そうでない場合、st1の両方が同じ長さだった場合、sが上位ソートされている場合にのみ比較がtrueを返します。ただし、2番目の比較(String.Compare(s, t2, true) < 0)は影響を受けません。

TL; DR:はい、ランダムな文字できを追加し、最終的にあなたのシステムを中断しますが、唯一のst1が正確にランダムな文字を除いて同じであることを場合には

-1

文字列の最後にランダムな文字を追加した場合は、String.Substringを使用できませんでしたか?

public static string mTimeFormat = "yyyyMMdd_HHmmss_fff"; 

string t1 = startTime.ToString(mTimeFormat); 
string t2 = endTime.ToString(mTimeFormat); 
List<string> results = fileNameList.FindAll(s => (String.Compare(s.Substring(0, mTimeFormat.Length), t1, true) > 0) && (String.Compare(s.Substring(0, mTimeFormat.Length), t2, true) < 0)); 

彼らはフォーマット文字列より長い場合、これは、それによって完全に問題を回避する、文字列t1t2を切り捨てます。

+0

(これまで存在していなかった)問題を回避するためにクルージングについて質問することはありません。並べ替えの振る舞いに関する具体的な質問です。 –

1

私はそれがうまくいっても、間違ったアプローチであることを示唆しています。たいていの場合、別の目的のために使用されることが意図されているフィールドに情報を追加するのは間違いです。コードが非常に脆く、維持しにくいものになります。ほとんどのプロの開発者はこれを行うことを決して考えません。

代わりに、必要な情報を組み込んだクラスを作成します。これは現在、文字列値と見なされ、乱数を表す型のフィールドです。要件の変更に伴い、このクラスに追加の機能を簡単に追加することができます。

クラスは、おそらくIComparableを実装するか、compareメソッドを使用するためにIComparerのクラスを実装する必要があります。詳細はlinkを参照してください。