【问题标题】:Sort subdomains based on domains根据域对子域进行排序
【发布时间】:2015-01-30 17:34:22
【问题描述】:

我有类似的域和子域列表

abc.com
def.com
ijk.com
pages.abc.com
help.abc.com
contactus.def.com
help.def.com

我的要求是按域对这个列表进行排序,这样最终的输出是

abc.com
pages.abc.com
help.abc.com
def.com
contactus.def.com
ijk.com

如何在 C# 中实现这一点?我是 C# 编程的新手。有人可以帮忙吗?

【问题讨论】:

    标签: c# jquery html


    【解决方案1】:

    认为您对示例进行排序时出错,但这里有一个解决方案:

    class DomainComparer : IComparer<string>
    {
        public int Compare(string x, string y)
        {
            if(x==y) return 0;
            string[] _x = x.Split('.');
            string[] _y = y.Split('.');
            return Compare(_x, _y, 0);
        }
    
        private int Compare(string[] x, string[] y, int depth)
        {
            if (x.Length - depth - 1 >= 0 && y.Length - depth -1 < 0)
            {
                return +1;
            }
    
            if (y.Length - depth - 1 >= 0 && x.Length - depth -1 < 0)
            {
                return -1;
            }
    
            if (x[x.Length-depth-1].CompareTo(y[y.Length - depth-1]) == 0)
            {
                return Compare(x, y, depth + 1);
            }
            else
            {
                return x[x.Length-depth-1].CompareTo(y[y.Length - depth-1]);
            }
        }
    }
    

    然后你可以调用它:

    string[] domains = new[] { "abc.com", "def.com", "ijk.com", "pages.abc.com", "help.abc.com", "contactus.def.com", "help.def.com" };
    
    Array.Sort(domains, new DomainComparer());
    foreach (var item in domains)
    {
        Console.WriteLine(item);    
    }
    

    输出:

    abc.com
    help.abc.com
    pages.abc.com
    def.com
    contactus.def.com
    help.def.com
    ijk.com
    

    或者如果你没有数组但是有一个

    List<string>
    

    或者一个

    IEnumerable<string>
    

    你可以用 Linq 做到这一点:

    IEnumerable<string> sorted = domains.OrderBy(x => x, new DomainComparer());
    

    【讨论】:

    • 如果您没有不同的域,则添加特殊情况
    【解决方案2】:

    如果您只需要按二级域和 TLD 进行排序,那么您可以这样做。

    var uriList = new string[] {"abc.com", "def.com", "ijk.com", "pages.abc.com", 
         "help.abc.com", "contactus.def.com", "help.def.com"};
    var query = from uri in uriList.Select(item => 
        new { Uri = item, UriParts = item.Split('.') }) 
        orderby uri.UriParts[uri.UriParts.Length-2] + uri.UriParts[uri.UriParts.Length-1],
        string.Join(".", uri.UriParts) select uri.Uri;
    
    Console.WriteLine(string.Join(" ,", query));
    

    输出将与您的预期略有不同,如下所示。

    abc.com、help.abc.com、pages.abc.com、contactus.def.com、def.com、help.def.com、ijk.com

    【讨论】:

      【解决方案3】:

      可以这样做:

              List<string> list = new List<string>();
              list.Add("abc.com");
              list.Add("def.com");
              list.Add("ijk.com");
              list.Add("pages.abc.com");
              list.Add("help.abc.com");
              list.Add("contactus.def.com");
              list.Add("help.def.com");
              List<string> listRoot = new List<string>();
              List<string> listSub = new List<string>();
              foreach (string item in list)
              {
                  string[] split = item.Split(new char[] {'.'}, StringSplitOptions.RemoveEmptyEntries);
                  if (split.Length == 2)
                  {
                      listRoot.Add(item);
                  }
                  else
                  {
                      listSub.Add(item);
                  }
              }
              listRoot.Sort();
              Dictionary<string, List<string>> dictionary = new Dictionary<string, List<string>>();
              foreach (string root in listRoot)
              {
                  List<string> listSubIntern = new List<string>();
                  foreach (string item in listSub)
                  {
                      if (item.EndsWith(root, StringComparison.InvariantCultureIgnoreCase))
                      {
                          listSubIntern.Add(item);
                      }
                  }
                  listSubIntern.Sort();
                  dictionary.Add(root, listSubIntern);
              }
              foreach (KeyValuePair<string, List<string>> keyValuePair in dictionary)
              {
                  Console.WriteLine(keyValuePair.Key);
                  foreach (string s in keyValuePair.Value)
                  {
                      Console.WriteLine("\t{0}", s);
                  }
              }
      

      和输出:

      abc.com
          help.abc.com
          pages.abc.com
      def.com
          contactus.def.com
          help.def.com
      ijk.com
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-07
        相关资源
        最近更新 更多