如何创建可以二进制搜索的“全局”不可变List <t>列表</t>

时间:2014-04-26 01:15:50

标签: c# list readonly binary-search

问题:当我的节目明星时,我创建了一个List<myClass> myList并用对象填充它。这些对象是使用文件中的日期创建的。之后,我不想更改该列表,也不想再次访问这些文件。但我需要在很多类/方法中访问该List

我提出的解决方案:在静态类中创建List<myClass> myList作为私有,并使用我的静态类的构造函数填充它,并仅使用返回myList.AsReadOnly()的属性访问它。这样我就无法改变实际的清单。但是AsReadOnly的回归是一个IList,对吧?我正在检查MSDN上的IList,并且没有BinarySearch方法......这将使整个事情变得非常缓慢。

我该如何解决这个问题?复制IList返回正常列表,以便我可以对它进行排序和二进制搜索吗?或者可能更改整个“myList.AsReadOnly()”方法?我愿意接受各种建议和方法^^改变整个代码不是问题。

编辑:

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

2 个答案:

答案 0 :(得分:7)

如果您使用的是.Net的更高版本,而不是使用AsReadOnly(),请使用ImmutableList<T>。它一旦创建就无法修改,但具有您正在寻找的BinarySearch()方法。如果您想要细分列表或从多个线程访问它,它也可能更有效。

答案 1 :(得分:2)

在这种情况下,取决于个人喜好。这是我的,作为一个例子:

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.  */);
}