如何高效地返回分类列表中的第一个和最后一个项目<&燃气轮机;在C#中?
我的问题与下面的问题类似,但使用的是如何高效地返回分类列表中的第一个和最后一个项目<&燃气轮机;在C#中?,c#,sortedlist,C#,Sortedlist,我的问题与下面的问题类似,但使用的是SortedList,而不是原来的SortedList 似乎没有像GetKey()这样的函数,您可以简单地使用list.FirstOrDefault()和list.LastOrDefault() 如果列表为空,这两个方法将返回default(KeyValuePair) 最好使用它们,因为如果列表为空,使用list.First()和list.Last()将抛出错误。根据您(不太清楚)的问题,您希望检索列表中第一个和最后一个项目的键 SortedList实现了I
SortedList
,而不是原来的SortedList
似乎没有像
GetKey()
这样的函数,您可以简单地使用list.FirstOrDefault()
和list.LastOrDefault()
如果列表为空,这两个方法将返回default(KeyValuePair)
最好使用它们,因为如果列表为空,使用list.First()
和list.Last()
将抛出错误。根据您(不太清楚)的问题,您希望检索列表中第一个和最后一个项目的键
SortedList
实现了IEnumerable
以便执行以下操作:
sortedList.FirstOrDefault().Key
及
我会归还这些钥匙
编辑:
正如@mjwills所建议的,就性能而言,使用Keys
属性是一个更好的主意,因为它实现了IList
,并且LastOrDefault
经过优化以处理此类情况(不获取整个集合以获取最后一项):
使用IEnumerable.Last或IEnumerable.LastOrDefault方法仅对IList值有效。让我们看一下-访问非IList的最后一项需要遍历所有项
为了提高效率,可以更好地依赖IList()类型的或属性:
var sl=new SortedList();
对于(变量i=0;i<50000;i++){
sl.Add(i.ToString(“X8”),i);
}
WriteLine(“SortedList是IList:+(sl是IList));
WriteLine(“SortedList中的Keys属性为IList:+(sl.Keys为IList));
Console.WriteLine(“\n\n性能度量-获取最后一个键:”);
var firstKey=sl.First().Key;
watch.Restart();
var lastKey=sl.Last().Key;
看,停;
WriteLine(“*非IList访问获取{0}(第一个键:{1},最后一个键:{2})”,watch.appeased.totalmillizes,firstKey,lastKey);
firstKey=sl.Keys.First();
watch.Restart();
lastKey=sl.Keys.Last();
看,停;
WriteLine(“*IList访问获取{0}(第一个键:{1},最后一个键:{2})”,watch.appeased.totalmillizes,firstKey,lastKey);
Console.WriteLine(“\n\n性能度量-获取最后一个值:”);
var firstValue=sl.First().Value;
watch.Restart();
var lastValue=sl.Last().Value;
看,停;
WriteLine(“*非IList访问获取{0}(第一个值:{1},最后一个值:{2})”,watch.appeased.total毫秒,firstValue,lastValue);
firstValue=sl.Values.First();
watch.Restart();
lastValue=sl.Values.Last();
看,停;
WriteLine(“*IList访问获取{0}(第一个值:{1},最后一个值:{2})”,watch.appeased.totalMillicles,firstValue,lastValue);
Console.WriteLine(“\n\n性能度量-按键获取最后一个值:”);
watch.Restart();
lastKey=sl.Keys.Last();
lastValue=sl[lastKey];
看,停;
WriteLine(“*IDictionary访问采用{0}(最后一个键:{1},最后一个值:{2})”,watch.appeased.totalmillizes,lastKey,lastValue);
/*
执行结果:
SortedList为IList:False
SortedList中的Keys属性为IList:True
性能度量-获取最后一个关键点:
*非IList访问采用0.7146(第一个键:00000000,最后一个键:0000C34F)
*IList访问采用0.0032(第一个键:00000000,最后一个键:0000C34F)
性能度量-获取最后一个值:
*非IList访问采用0.7366(第一个值:0,最后一个值:49999)
*IList访问采用0.0003(第一个值:0,最后一个值:49999)
性能度量-按键获取最后一个值:
*IDictionary访问采用0.0036(最后一个键:0000C34F,最后一个值:49999)
*/
首先对有效吗?你认为最后一次你会用什么索引?在我看来这是我的错。我只读了第一个答案。“似乎没有像GetKey()这样的函数。”您想要键还是项目?可能更快(假设它是O(1)
),那么获取LastOrDefault
会直接跳到最后一个@vc74?哦,酷。我不知道。
sortedList.LastOrDefault().Key
sortedList.Keys.FirstOrDefault()
sortedList.Keys.LastOrDefault()