0

我不想有任何不必要的代码,但我也想“安全”。经验观察表明,下面的 OrderBy 什么都不做 - List 已经正确排序。我可以依靠这种情况,并删除该 OrderBy 行吗?

HashSet<int> hashSet = new HashSet<int>();
List<int> listInts = new List<int>();
using (var file = new System.IO.StreamReader(selectedFile)) {
    string line;
    int lineNum = 0;
    int Offset = (int)numericUpDownLinesOfContext.Value;
    while ((line = file.ReadLine()) != null)     {
        lineNum++;
        if (line.Contains(PlatypusToSearchFor)) {
            // This adds the lines before and after that will provide the desired context
            // (N lines from the log file before and after the searched for value)
            hashSet.UnionWith(Enumerable.Range(lineNum - Offset, Offset * 2 + 1));
        }
    }
    // Remove any negative numbers, as well as 0, that might have been added 
    // (0, -1, -2, or -3 are all possibilities, but the first line is #1)
    listInts = hashSet.Where(i => i >= 1).ToList();
    // They seem to be ordered correctly already, but this is just in case:
    listInts = listInts.OrderBy(i => i).ToList();
}
4

3 回答 3

5

不,您不应该删除OrderBy. HashSet不保证任何特定的顺序。你可能在测试中很幸运,但你不能保证它会按照你期望的方式排序。

HashSet(http://msdn.microsoft.com/en-us/library/bb359438.aspx) 上的 MSDN 文档:

集合是不包含重复元素且其元素没有特定顺序的集合

(重点补充)

于 2012-06-04T18:19:49.903 回答
3

如前所述HashSet,没有任何特定的顺序。如果你需要这种行为,你可以使用 aSortedSet代替,然后你就不需要OrderBy.

于 2012-06-04T18:25:51.423 回答
2

UnionWith操作不会保留顺序。但是,您也不必使用该OrderBy行,因为 .NET 提供了一个SortedSet<T>公开集合操作和自动排序行为的类。

于 2012-06-04T18:27:11.227 回答