如何创建一个“;全局“;不可变列表<;T>;可以二进制搜索的列表
本文关键字:列表 lt 搜索 二进制 gt 全局 创建 何创建 一个 不可变 | 更新日期: 2023-09-27 18:00:09
问题是:当我的程序启动时,我会创建一个List<myClass> myList
并用对象填充它。这些对象是用文件中的日期创建的。在那之后,我不想更改该列表,也不想再次访问这些文件。但我需要在很多类/方法中访问该列表
我想出的解决方案是:在静态类中创建List<myClass> myList
作为私有,并使用我的静态类的构造函数填充它,并且只使用返回myList.AsReadOnly()的属性来访问它。这样我就无法更改实际列表。但AsReadOnly的回归是IList,对吧?我在MSDN上查看IList,没有BinarySearch方法。。。这会使整个过程变得相当缓慢。
我该如何解决这个问题?复制IList返回到一个普通的列表,这样我就可以对它进行排序和BinarySearch?或者改变整个"myList.AsReadOnly()"方法?我愿意接受各种建议和方法^^更改整个代码不是问题。
编辑:
- TL;DR我如何制作一个"全局"列表,该列表可以被程序中的任何方法/类访问,可以使用List.Sort方法进行排序,该方法可以是二进制的,并且在创建后不能更改其内容(既不能通过添加也不能删除元素)
- 我一回家就会贴一些代码
如果您使用的是.Net的更高版本,而不是使用AsReadOnly(),请使用ImmutableList<T>
。创建后不能修改它,但它具有您要查找的BinarySearch()
方法。如果您想细分列表或从多个线程访问列表,它也可能更高效。
在这种情况下,取决于个人偏好。这是我的,举个例子:
private List<string> _MyList = new List<string>();
private void InitializeList()
{
//code here to fill list.
//Keep in mind, that binary search works on sorted lists.
_MyList.Sort(/* Place your object comparer here. */);
}
//Make a copy in an array.
public string[] MyListAsArray
{
get { return _MyList.ToArray(); }
}
public int GetBinarySearchIndex(string value)
{
return Array.BinarySearch(MyListAsArray, value/*, Place your object comparer here. */);
}