2016-09-06 15 views
-2

どのようにして、Comparerで負の数値が考慮されるのですか? 私の文字列の数字を並べ替えるのは分かっていますが、マイナス(「減算」)記号が残っています。だから私は間違った出力を得る、コードの下を参照してください。文字列内の数値の並べ替え

public class MixedNumbersAndStringsComparer : IComparer<string> 
{ 
    public int Compare(string x, string y) 
    { 
     double xVal, yVal; 

     if (double.TryParse(x, out xVal) && double.TryParse(y, out yVal)) 
      return xVal.CompareTo(yVal); 
     else 
      return string.Compare(x, y); 
    } 
} 

実際の出力:

0 DAG(e)は5時間(R) - XX - XX

3 DAG(E)、3時間(R) - XX - XX

-4 DAG(E)-17時間(R) - XX - XX

-6 DAG(E)-18時間(R) - XX - XX

8 DAG(E)1時間(R) - XX - XX

8 DAG(e)は4時間(R) - XX - XX

予想される出力は、次のとおり

- 6 DAG(E)-18時間(R) - XX - XX

-4 DAG(E)-17時間(R) - XX - XX

0 DAG(e)は5時間(R) - xx - xx

3 DAG(E)、3時間(R) - XX - XX

8 DAG(E)1時間(R) - XX - XX

8 DAG(e)は4時間(R) - XX -

入力データがあるXX:

TimeSpan tidtilbage = timeToExpire.GetTimeRemainingUntilPasswordExpiration("DOMAIN", p.SamAccountName); 
TimeSpan under10 = new TimeSpan(10, 00, 00, 00); 
TimeSpan ikkeMinus10 = new TimeSpan(-10, 00, 00, 00); 
if (tidtilbage < under10 && tidtilbage > ikkeMinus10) 
{ 

    if (u.Enabled == true) 
    { 
     string lines = tidtilbage.Days + " dag(e) " 
       + tidtilbage.Hours + " time(r)" + " - " 
       + p.SamAccountName.ToUpper() + " - " + p.DisplayName + "\n\n"; 

     sorted[i] = lines; 
     Array.Sort(sorted, new MixedNumbersAndStringsComparer()); 
     i++; 
    } 
} 
+0

これは少し不明です。出力がプログラムスニペットにどのように関係しているのかは明らかではありません。改めてお祈りください。 – Bathsheba

+0

期待どおりの行動と実際の行動を提供してください。例えば。 "-1"> "-5"、実際には "-1" <"-5" –

+0

また、実際の入力値を教えてください。 「-4」と「-17」「-4 dag(e)」と「-17 time(r)」を比較していますか? – Pikoh

答えて

3

あなたが論理ソート(すなわち探しているようだtaht >"9""10"ソート論理的ですが"10" < "9"はあなたの並べ替え辞書順):整数として文字列内整数を扱います。クイックと汚い(相互運用)実装:あなたもIComparer<string>を取り除くことができます

using System.Runtime.InteropServices; 

... 

public sealed class MixedNumbersAndStringsComparer : IComparer<string> { 
    [DllImport("shlwapi.dll", CharSet = CharSet.Unicode)] 
    private static extern int StrCmpLogicalW(string left, string right); 

    public int Compare(string left, string right) { 
    return StrCmpLogicalW(left, right); 
    } 
} 

[DllImport("shlwapi.dll", CharSet = CharSet.Unicode)] 
private static extern int StrCmpLogicalW(string left, string right); 
... 

string[] data = ...; 

Array.Sort(data, (left, right) => StrCmpLogicalW(left, right)); 
+1

ドミトリー、答えのおかげで、コードを実装しようとすると、SafeNativeMethodsは現在のコンテキストに存在しません。System.Runtime.InteropServicesを使用する以外はこの作業を行う必要があります。 –

+1

@MathiasRønnowNørtoft:私はタイプミス(私のソリューションを簡素化するときに 'SafeNativeMethods'クラスを削除しました)は残念です。' return StrCmpLogicalW(left、right); –

1

SafeNativeMethodsは、あなたがしたい場合は、実装しなければならないクラスです。 は、このクラスでは、このコードを追加する必要があります:

[DllImport("shlwapi.dll", CharSet=CharSet.Unicode, ExactSpelling=true)] 
static extern int StrCmpLogicalW(string x, string y); 

をしかし、ドミトリーでDLLIMPORTがすでに同じクラスに実装されて答えます。したがって、「SafeNativeMethods」と書く必要はありません。

ドミトリーの正しいコードは次のとおりです。

using System.Runtime.InteropServices; 

... 

public sealed class MixedNumbersAndStringsComparer : IComparer<string> { 
    [DllImport("shlwapi.dll", CharSet = CharSet.Unicode)] 
    private static extern int StrCmpLogicalW(string left, string right); 

    public int Compare(string left, string right) { 
    return MixedNumbersAndStringsComparer.StrCmpLogicalW(left, right); // or return StrCmpLogicalW(left, right); 
    } 
} 

こんにちは。

関連する問題