C# 我希望有一个以(开始,结束)为键的数据结构,然后能够在整个数据结构中搜索整数并得到相应的值

C# 我希望有一个以(开始,结束)为键的数据结构,然后能够在整个数据结构中搜索整数并得到相应的值,c#,data-structures,C#,Data Structures,我想喝一杯 data structure with <Key, Value> where Key = (start, end), Value = string 带有where的数据结构 键=(开始,结束), 值=字符串 之后,我应该能够在数据结构中优化搜索一个整数,并得到相应的值 例如: var lookup = new Something<(int, int), string>() { {(1,100),"In 100s"}, {(101,200)

我想喝一杯

data structure with <Key, Value> where
  Key = (start, end), 
  Value = string
带有where的数据结构
键=(开始,结束),
值=字符串
之后,我应该能够在数据结构中优化搜索一个整数,并得到相应的值

例如:

var lookup = new Something<(int, int), string>()
{
  {(1,100),"In 100s"},
  {(101,200),"In 100-200"},
}

var value1 = lookup[10]; //value1 = "In 100s"
var value2 = lookup[110]; //value2 = "In 100-200"
var lookup=newsomething()
{
{(1100),“在100年代”},
{(101200),“在100-200”},
}
var value1=查找[10]//value1=“以100秒为单位”
var value2=查找[110]//value2=“在100-200中”

有人可以建议吗?

您基本上有一个
字典结构,例如:

var lookup = new Dictionary<(int, int), string>()
{
  {(1,100),"In 100s"},
  {(101,200),"In 100-200"},
};
var searchValue = 10;
var value1 = lookup.First(l => l.Key.Item1 <= searchValue && l.Key.Item2 >= searchValue);

searchValue = 110;
var value2 = lookup.First(l => l.Key.Item1 <= searchValue && l.Key.Item2 >= searchValue);
var lookup=newdictionary()
{
{(1100),“在100年代”},
{(101200),“在100-200”},
};
您可以使用一些基本Linq查询来搜索该容器,例如:

var lookup = new Dictionary<(int, int), string>()
{
  {(1,100),"In 100s"},
  {(101,200),"In 100-200"},
};
var searchValue = 10;
var value1 = lookup.First(l => l.Key.Item1 <= searchValue && l.Key.Item2 >= searchValue);

searchValue = 110;
var value2 = lookup.First(l => l.Key.Item1 <= searchValue && l.Key.Item2 >= searchValue);
var searchValue=10;
var value1=lookup.First(l=>l.Key.Item1=searchValue);
搜索值=110;
var value2=lookup.First(l=>l.Key.Item1=searchValue);

但正如Lee在评论中所建议的,使用
SortedDictionary
可能会获得更好的性能,您的里程数可能会有所不同,这意味着您需要测试两者的性能

如果您希望能够像您提到的那样使用类似于
lookup[10]
的东西,您可以创建自己的类来实现某种键/值数据类型。最终决定使用哪种底层数据类型实际上取决于数据的外观

下面是一个在实现
字典时执行此操作的简单示例:

其输出为:


就这种方法的性能而言,以下是一些测试的示例(使用Win10和Intel i7-4770 CPU)从包含10000000条记录的字典中检索值:

var lookup = new RangeLookup();

for (var i = 1; i <= 10000000; i++)
{
    var max = i * 100;
    var min = max - 99;
    lookup.Add((min, max), $"In {min}-{max}s");
}

var stopwatch = new Stopwatch();

stopwatch.Start();
Console.WriteLine($"50: {lookup[50]} (TimeToLookup: {stopwatch.ElapsedMilliseconds})");

stopwatch.Restart();
Console.WriteLine($"5,000: {lookup[5000]} (TimeToLookup: {stopwatch.ElapsedMilliseconds})");

stopwatch.Restart();
Console.WriteLine($"1,000,000,000: {lookup[1000000000]} (TimeToLookup: {stopwatch.ElapsedMilliseconds})");
var lookup=new RangeLookup();

对于(var i=1;i)您需要给出一些示例数据,我们需要一个。请尝试使其标题和描述更匹配。标题听起来像是在寻找类似于
字典的东西,但您的问题使其看起来像字典的键是某种类型的2元组(虽然我不知道什么类型的
start
end
(在你的元组中)嗨@Peeush Agarwal,欢迎来到Stack Overflow,你有没有尝试实现一个特别的算法?你有没有研究过选项?请随意分享任何例子。你有没有
(开始,结束)呢
区间重叠?如果它们重叠,你可以看一下,否则你可以在开始时使用一个
排序字典。
这里什么是
什么东西
?你基本上有字典吗?虽然这样做有效,但我不太喜欢索引器的轻微滥用。我只是觉得有点不舒服。@devNull这正是我想要的ed.我可以和索引器一起生活,因为他们使代码变得简单和抽象。谢谢分享性能计时。