如何创建一个“;全局“;不可变列表<;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()"方法?我愿意接受各种建议和方法^^更改整个代码不是问题。

编辑:

  1. TL;DR我如何制作一个"全局"列表,该列表可以被程序中的任何方法/类访问,可以使用List.Sort方法进行排序,该方法可以是二进制的,并且在创建后不能更改其内容(既不能通过添加也不能删除元素)
  2. 我一回家就会贴一些代码

如何创建一个“;全局“;不可变列表<;T>;可以二进制搜索的列表

如果您使用的是.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.  */);
}