【问题标题】:How do I order two GUIDs as the lowest first?如何订购两个 GUID 作为最低的优先?
【发布时间】:2014-08-30 13:09:51
【问题描述】:

我有 2 个 GUID - guid1 和 guid2。我想将它们组合成一个 guid,首先订购最低的。

所以我会这样做:

if(Guid1.Length != Guid2.Length)
{
    if (Guid1.Length > Guid2.Length)
        return Guid2 + Guid1;
    else
        return Guid1 + Guid2;
}
else
{
    var isDiff = true;
    var index = Guid1.Length - 1;
    while(isDiff)
    {
        if (index < 0) // same guids
            return Guid1 + Guid2;

        if(Guid1[index] == Guid2[index])
        {
            index--;
        }
        else
        {
            // Here stuck
        }

    }
}

在注释部分,我想检查每个字符是数字还是字母,找到最低的,然后连接并首先返回最低的字符串。

例子:

guid1 = "ab12"; guid2 = "a21c";

所以我认为每个字符串字符都可以转换成它的 ASCII 等价物,然后找到最小值。

对于我的例子,返回的字符串是:

guid1 + guid2 = "ab12a21c"

因为第二个字符的十进制值是 32(对于数字 2)和 98(对于 b)。

这是最好的方法吗?如果是这样,我如何在 c# 中转换为 ASCII?

【问题讨论】:

  • 你对“最低”的定义是什么?
  • 另外,您的“guid”似乎是一个字符串。为什么不改用Guid 结构呢?然后你可以更容易地比较它们,只选择较低的(结构实现IComparable
  • @HonzaBrestan 如果我没记错的话,我的 MVC Identity 生成的用户 ID 是数据库中的字符串。我会仔细检查一下。
  • @UweKeim 被认为是最低的。我正在制作一个标准功能。在我的示例中,它将是根据 ASCII 表将字符串转换为十进制值获得的最小值

标签: c#


【解决方案1】:

所有 Guid 的长度相同。您也可以使用 CompareTo 方法,如下例所示。

using System;

namespace ConsoleApplication1
{
class Program
{

    static void Main(string[] args)
    {

        Guid g1 = Guid.Parse("c47632a3-274b-44d0-93df-f9626a033a6f");
        Guid g2 = Guid.Parse("c47632a3-274b-43d0-93df-f9626a033a6f");
        Console.WriteLine(g1);
        Console.WriteLine(g2);
        Console.WriteLine(GetResult(g1,g2));
        Console.ReadLine();
    }
    public static string GetResult(Guid Guid1, Guid Guid2)
    {
        return Guid1.CompareTo(Guid2) < 0 ? Guid1.ToString() + Guid2.ToString() : Guid2.ToString() + Guid1.ToString();
    }
}

}

在上面的例子中,g2 是第一位的。
如果您将“43d0”更改为“45d0”,g1 将首先出现
这不是你需要的吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    • 2013-06-05
    • 2011-02-17
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    相关资源
    最近更新 更多