繁体   English   中英

如何在C#中按数字顺序排序分隔字符串数组

[英]How to numerically order array of delimited strings in C#

我有点受约束。 我正在使用遗留系统,其中包含一堆我需要解析的分隔字符串。 不幸的是,字符串需要根据字符串的第一部分进行排序。 该数组看起来像

array[0] = "10|JohnSmith|82";
array[1] = "1|MaryJane|62";
array[2] = "3|TomJones|77";

所以我想让数组看起来像

array[0] = "1|MaryJane|62";
array[1] = "3|TomJones|77";
array[2] = "10|JohnSmith|82";

我想过做一个2维数组来抓住第一部分并将字符串留在第二部分,但是我可以在这样的二维数组中混合类型吗?

我不确定如何处理这种情况,有人可以帮忙吗? 谢谢!

调用Array.Sort ,但传入IComparer<string>的自定义实现:

// Give it a proper name really :)
public class IndexComparer : IComparer<string>
{
    public int Compare(string first, string second)
    {
        // I'll leave you to decide what to do if the format is wrong
        int firstIndex = GetIndex(first);
        int secondIndex = GetIndex(second);
        return firstIndex.CompareTo(secondIndex);
    }

    private static int GetIndex(string text)
    {
        int pipeIndex = text.IndexOf('|');
        return int.Parse(text.Substring(0, pipeIndex));
    }
}

或者,通过适当地拆分字符串,将字符串数组转换为自定义类型数组。 如果你要对数组做进一步的工作,这将使生活更轻松,但如果你需要对值进行排序,那么你也可以使用上面的代码。

你确实说你需要解析字符串 - 所以你有什么特别的理由要在解码之前解析它们吗?

        new[] {
            "10|JohnSmith|82",
            "1|MaryJane|62",
            "3|TomJones|77",
        }.OrderBy(x => int.Parse(x.Split('|')[0]));

使用ArrayList( http://msdn.microsoft.com/en-us/library/system.collections.arraylist_methods ( VS.80 ) .aspx )以便对其进行排序。

如果数组很大,您将需要在一次传递中提取所有初始整数,因此您不会在每次比较时解析字符串。 IMO,你真的想首先将字符串中编码的信息封装到一个类中。 然后对这些对象的数组进行排序。

就像是:

class Person {
  int Index { get; }
  string Name { get; }
  int Age { get; }  // just guessing the semantic meaning
}

那么:

  1. 将编码的字符串映射到Person对象的ArrayList
  2. 然后使用ArrayList.Sort(IComparer) ,其中比较器仅查看索引。

这可能比在每次比较中使用解析更好。

对于lolz

Array.Sort(array, ((x,y) => (int.Parse(x.Split('|')[0]) < int.Parse(y.Split('|')[0])) ? -1 : (int.Parse(x.Split('|')[0]) > int.Parse(y.Split('|')[0])) ? 1 : 0));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM