2016-09-06 22 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你正在寻找逻辑排序(即把字符串中整数整数"10">"9"当你排序逻辑,但"10" < "9"当你按字典顺序排序)。快速而肮脏(互操作)执行:

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); 
    } 
} 

你甚至可以摆脱IComparer<string>

[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); 
    } 
} 

嗨。