搜索并添加按字母顺序排列的列表

时间:2017-01-13 07:25:58

标签: c# list search

我的数据库包含一个csv文件。我想在第一列按字母顺序排列,以便在搜索时我可以在我已经过去的位置找到搜索项目时停止。

设置:我已经将整个csv文件读入名为fullDB的List<string>,并且我有一个名为itemToFind的搜索字符串。这是我的搜索代码:

public string[] isFoundInDB(List<string> fullDB, string itemToFind)
{
    for (int i = 0; i < fullDB.Count; i++)
    {
        string[] line = fullDB[i].Split(',');

        if (itemToFind.CompareTo(line[0]) < 0)
        {
            return new string[] { "-1", i.ToString(), "-1", "-1", "-1", "-1" }; //not found
        }

        if (line[0] == itemToFind)
        {
            return new string[] { i.ToString(), line[0], line[1], line[2], line[3], line[4] };
        }
    }

    return new string[] { "-1", fullDB.Count.ToString(), "-1", "-1", "-1", "-1" }; //not found
}

所以这将为我提供在数据库中找到它的索引,或者它将为我提供itemToFind过去按字母顺序排列的索引。如果找到了,我会修改那里的值。如果找不到,我会使用List.Insert

按字母顺序将其插入正确的位置

我的问题是,如果在数据库中找不到itemToFind,那么执行当前List.Insert或者执行List.Add会更有效率,然后在我执行时对整个事物进行排序添加东西了吗?我可能会使用此代码对整个数据库进行排序:

IEnumerable<string> query =
    from line in fullDB
    let x = line.Split(',')
    orderby x[0]
    select x[0] + "," + x[1] + "," + x[2] + "," + x[3] + "," + x[4];

fullDB = query.ToList();

还是有另一种更好的方法吗?

使用C#,.NET framework 4.0

1 个答案:

答案 0 :(得分:1)

我会使用SortedDictionary,第一列作为键:

\#if (NLC_LS_AVL == 1)  
  &ensp;func2(); <br>
\#else<br>
 &ensp;func3();<br>
\#endif

然后你就可以进行O(log n)搜索了:

List<string> lines = ... // read csv file

SortedDictionary<string, string> sortedLines = new SortedDictionary<string, string>();
foreach (string line in lines)
{
    string[] fields = line.Split(',');
    sortedLines[fields[0]] = line;
}

如果第一列不是唯一的,您可以使用:

string foundLine;
if (sortedLines.TryGetValue(itemToFind, out foundLine))
{
    ... // handle the found line
}
else
{
    // add a new line:
    string newLine = // ...
    sortedLines.Add(itemToFind, newLine);
}