通过SortedList

时间:2015-05-14 22:52:07

标签: c# sortedlist

SortedList<string, systemuser> Users = new SortedList<string, systemuser>();
Users.Add("username1",customobject);
Users.Add("username2",customobject);
Users.Add("username3",customobject);

我要做的是在列表中搜索特定密钥(即用户名)并返回列表中的下一个项目。如果我在列表的末尾,那么我需要在第一个位置返回该项目。

不确定如何解决这个问题,因为SortedList似乎没有公开索引属性。

我有:

foreach (KeyValuePair<string, systemuser> pair in Users)
{
    if (pair.Key == lastAllocation)
    {
        // RETURN THE ITEM IMMEDIATELY AFTER THIS ONE
    }
}

任何建议都表示赞赏!

7 个答案:

答案 0 :(得分:2)

首先获取搜索元素的索引。然后获取必要的密钥(不要忘记模块%)。最后访问所爱的人:))

SortedList<string, systemuser> Users = new SortedList<string, systemuser>();
Users.Add("username1",customobject);
Users.Add("username2",customobject);
Users.Add("username3",customobject);

var index = Users.IndexOfKey("username1"); // check not found if necessary
var nextItemKey = s.Keys[(index + 1) % Users.Count()];
var nextItemValue = Users.IndexOfKey(nextItemKey);

答案 1 :(得分:1)

SortedList包含执行此操作所需的方法。查看IndexOfKeyGetByIndex

答案 2 :(得分:1)

您在寻找下一个项目(KeyValuePair),值还是索引?

bool returnNextItem = false;
foreach (KeyValuePair<string, systemuser> pair in Users)
{
    if (returnNextItem)
        return pair.Value;
    if (pair.Key == lastAllocation)
        returnNextItem = true;
}

答案 3 :(得分:0)

您可以使用IndexOfKey在给定用户名列表中查找位置。

使用返回的索引,您可以返回下一个项目,或返回列表中的第一个项目。

var idx = Users.IndexOfKey("username2");

if (idx == (Users.Count - 1)){
    return Users.First().Key;
}
else{
    return Users.Keys[idx + 1];
    //.net 4.5+ can Users.GetByIndex()
}

答案 4 :(得分:0)

当您致电foreach时,您真正在做的是致电Users.GetEnumerator();

这是以下的语法糖:

KeyValuePair<String, Systemuser> pair;
IEnumerator<KeyValuePair<String, Systemuser>> enumerator = Users.GetEnumerator();
while (enumerator.MoveNext())
{
    pair = enumerator.Current;
    // your code in the foreach loop here
}

简单的解决方案是手动使用枚举器来做你想做的事。

KeyValuePair<String, Systemuser> getSomething(String lastAllocation)
{

    IEnumerator<KeyValuePair<String, Systemuser>> enumerator = Users.GetEnumerator();
    while (enumerator.MoveNext())
    {
        if (enumerator.Current.Key == lastAllocation)
        {
            enumerator.MoveNext();
            return enumerator.Current; // null if not another
        }
    }
    return null;
}

答案 5 :(得分:0)

你可以试试这个。如果没有匹配,不确定你想要什么,所以我们只是返回一个新的KeyValuePair; 还要确保使用System.Linq;所以你可以访问ElementAt扩展方法。

   public static KeyValuePair<string, string> GetUserInfo(string username, SortedList<string, string> list)
    {
        int index = list.IndexOfKey(username);
        if(index == -1)
        {
            return new KeyValuePair<string, string>();
        }

        index = index == (list.Count - 1) ? 0 : index + 1;

        return list.ElementAt(index);
    }

答案 6 :(得分:0)

作为参考,SortedList有2个核心参考,一个在System.Collections(较旧)和System.Collections.Generic。在处理System.Collections.SortedList时,我只能使用Microsoft文章中引用的迭代方法(https://msdn.microsoft.com/en-us/library/system.collections.sortedlist(v=vs.110).aspx

这是myList是SortedList集合的循环。

  for ( int i = 0; i < myList.Count; i++ )  {

     Console.WriteLine( "\t{0}:\t{1}", myList.GetKey(i), myList.GetByIndex(i) );

  }

戴夫