使用Array.sort也可以对字符串进行排序

时间:2016-08-26 11:19:48

标签: c# visual-studio c#-4.0 c#-3.0

所以我试图制作一个“程序”,它给我一个密码输出,很快就会在我的公司AD中过期。但我遇到了一个小问题。当我调用“array.sort(array)”然后因为它是一个包含时间跨度和名字的字符串,它似乎将人们分成剩余时间,但不是先将最小数字分组。任何人都知道如何解决这个问题,因为它是一个字符串? *我知道我是一个业余程序员,代码很糟糕,难以阅读!

foreach (Principal p in grp.GetMembers(false))
{
    TimeSpan tidtilbage = timeToExpire.GetTimeRemainingUntilPasswordExpiration(DOMAIN, p.SamAccountName);
    TimeSpan under14 = new TimeSpan(14, 00, 00, 00);
    TimeSpan ikkeMinus10 = new TimeSpan(-10, 00, 00, 00);
    if (tidtilbage < under14 && tidtilbage > ikkeMinus10)
    {
        string lines = tidtilbage.ToString("%d") + " dag(e)" + " " + tidtilbage.ToString("%h") + " time(r)" + " - " + p.SamAccountName.ToUpper() + " - " + p.DisplayName +  "\n\n";
        sorted[i] = lines;
        Array.Sort(sorted);
        i++;
    }
    else
        continue;
}

foreach (var item in sorted)
{
    if (item == null || item == "")
        continue;
    else
    {
        Console.WriteLine("{0}", item);
        myWriter.WriteLine("{0}", item);
    }
}
myWriter.Close();

这是我得到的输出:

enter image description here

3 个答案:

答案 0 :(得分:2)

所以你想用最先出现的数值对字符串进行排序?然后,您需要使用int将该子字符串转换为int.Parse。您可以使用LINQ的OrderBy

订购
sorted = sorted
    .OrderBy(s => int.Parse(new String(s.TakeWhile(Char.IsDigit).ToArray())))
    .ToArray();

请注意,如果字符串不以整数开头,则会导致异常。

但是在这种情况下,也可以更好地存储原始的TimeSpan,然后很容易排序。

TimeSpan under14 = new TimeSpan(14, 00, 00, 00);
TimeSpan ikkeMinus10 = new TimeSpan(-10, 00, 00, 00);

sorted = grp.GetMembers(false)
    .Select(account => new 
    {
        tidtilbage  = timeToExpire.GetTimeRemainingUntilPasswordExpiration(DOMAIN, account.SamAccountName),
        account
    })
    .Select(x => new 
    {
         x.tidtilbage,
         lines = x.tidtilbage.ToString("%d") + " dag(e)" + " " + x.tidtilbage.ToString("%h") + " time(r)" + " - " + x.account.SamAccountName.ToUpper() + " - " + x.account.DisplayName +  "\n\n"
    })
    .Where(x => x.tidtilbage < under14 && x.tidtilbage > ikkeMinus10)
    .OrderBy(x => x.tidtilbage)
    .Select(x => x.lines)
    .ToArray()

答案 1 :(得分:0)

稍微偏离OP,但tidtilbage已经TimeSpan类型。您还可以使用List代替Array,并执行更清晰的操作。

示例示例:

List<TimeSpan> tsList = new List<TimeSpan>();
for (int i = 1; i <= 10; i++)
{
    Random rnd = new Random(i);
    TimeSpan ts = new TimeSpan(0,0,rnd.Next(10000));
    tsList.Add(ts);
}

//This is the line you will need
tsList = tsList.OrderBy(x => x.TotalSeconds).ToList();

您的tidtilbage所有TotalSeconds属性都可以轻松OrderBy()

只是为了给你一个想法..

答案 2 :(得分:0)

@TimSchmelter

foreach (Principal p in grp.GetMembers(false))
            {
               TimeSpan tidtilbage = timeToExpire.GetTimeRemainingUntilPasswordExpiration("cv.local", p.SamAccountName);
                TimeSpan under14 = new TimeSpan(14, 00, 00, 00);
                TimeSpan ikkeMinus10 = new TimeSpan(-10, 00, 00, 00);
                sorted = grp.GetMembers(false)
                .Select(x => new
                   {
                           tidtilbage = timeToExpire.GetTimeRemainingUntilPasswordExpiration("cv.local", p.SamAccountName),
                           lines = tidtilbage.ToString("%d") + " dag(e)" + " " + tidtilbage.ToString("%h") + " time(r)" + " - " + p.SamAccountName.ToUpper() + " - " + p.DisplayName + "\n\n"
                    })
                        .Where(x => x.tidtilbage < under14 && x.tidtilbage > ikkeMinus10)
                        .OrderBy(x => x.tidtilbage)
                        .Select(x => x.lines)
                        .ToArray();

                        i++;



            }