C# 我可以对guids列表排序并进行二进制搜索吗?

C# 我可以对guids列表排序并进行二进制搜索吗?,c#,guid,binary-search,C#,Guid,Binary Search,我有class值: class Value { public Guid Guid {get;set;} public double Val {get;set;} } 因此,如果我有两个大的值列表,如何对其排序,然后使用BinarySearch 我能做吗? 谢谢大家! LetList valList=newlist()是您的值列表,然后您可以根据属性Val对其进行排序,如下所示: valList = valList.OrderBy(x => x.Val).ToList();

我有class

class Value
{
   public Guid Guid {get;set;}
   public double Val {get;set;}
}
因此,如果我有两个大的
值列表
,如何对其排序,然后使用BinarySearch

我能做吗? 谢谢大家!

Let
List valList=newlist()
是您的
值列表
,然后您可以根据属性
Val
对其进行排序,如下所示:

 valList = valList.OrderBy(x => x.Val).ToList();   
总结: 如果您有一个
Value
列表,并且希望根据
Guid
对列表进行排序,则有两种可能性。可以根据所需的属性对列表进行显式排序,也可以实现
IComparable

另一种情况是:

public class Value: IComparable<Value>
{
    public int CompareTo(Value other)
    {
        if(other == null)
        {
            return 1;
        }
        return Guid.CompareTo(other.Guid);
    }
    //[...]
}
然后,当您要执行二进制搜索时,只需应用以下行:

int index = orderedList.BinarySearch(new Value{ Guid = guidToSearchFor });
例子:
使用System.IO;
使用制度;
使用System.Collections.Generic;
使用System.Linq;
班级计划
{
静态void Main()
{
列表=新列表
{
新值(){Guid=Guid.NewGuid()},
新值(){Guid=Guid.NewGuid()},
新值(){Guid=Guid.NewGuid()},
新值(){Guid=Guid.NewGuid()}
};
var orderedList=list.OrderBy(i=>i.ToList();
int index=orderedList.BinarySearch(新值{Guid=list[2].Guid});
控制台写入线(索引);
}
}
公共类值:IComparable
{
公共整数比较(值其他)
{
如果(其他==null)
{
返回1;
}
返回Guid.CompareTo(其他.Guid);
}
公共Guid Guid{get;set;}
公共双Val{get;set;}
}

@upvoter:投票前,确保问题有效。上述代码不会编译为Val的双值;我不会将该属性命名为Guid,我可以使用带有Guid by key的BinarySearch吗?问题不仅仅是排序。从我对这个问题的理解来看,更重要的部分是排序后的二进制搜索。这个问题不仅仅是排序。从我对这个问题的理解来看,更重要的部分是排序后的二进制搜索。谢谢我已经添加了二进制搜索的部分。我必须将
.ToList()
添加到
orderedList
才能编译该部分。当我使用有效的
Guid
for
guidToSearchFor
运行它时,我会得到一个
invalidoOperationException
“无法比较数组中的两个元素”。@Enigmativity请尝试我添加的示例,它是有效的。
var orderedList = list.OrderBy(i => i).ToList();
int index = orderedList.BinarySearch(new Value{ Guid = guidToSearchFor });
using System.IO;
using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
        List<Value> list = new List<Value>
        {
            new Value() { Guid = Guid.NewGuid() },
            new Value() { Guid = Guid.NewGuid() },
            new Value() { Guid = Guid.NewGuid() },
            new Value() { Guid = Guid.NewGuid() }
        };
    
        var orderedList = list.OrderBy(i => i).ToList();
        int index = orderedList.BinarySearch(new Value{ Guid = list[2].Guid });
        Console.WriteLine(index);
    }
}

public class Value: IComparable<Value>
{
    public int CompareTo(Value other)
    {
        if(other == null)
        {
            return 1;
        }
        return Guid.CompareTo(other.Guid);
    }
    
    public Guid Guid {get;set;}
    public double Val {get;set;}
}