如何从字典中获取第n个元素?

时间:2009-07-23 16:26:51

标签: c# dictionary

cipher = new Dictionary<char,int>;
cipher.Add( 'a', 324 );
cipher.Add( 'b', 553 );
cipher.Add( 'c', 915 );

如何获得第二个元素?例如,我想要像:

KeyValuePair pair = cipher[1]

其中对包含( 'b', 553 )


基于合作社使用List的建议,事情正在发挥作用:

List<KeyValuePair<char, int>> cipher = new List<KeyValuePair<char, int>>();
cipher.Add( new KeyValuePair<char, int>( 'a', 324 ) );
cipher.Add( new KeyValuePair<char, int>( 'b', 553 ) );
cipher.Add( new KeyValuePair<char, int>( 'c', 915 ) );

KeyValuePair<char, int> pair = cipher[ 1 ];

假设我确定项目按照添加顺序保留在列表中是正确的,我相信我可以使用List而不是SortedList建议。

8 个答案:

答案 0 :(得分:34)

问题是字典未排序。你想要的是SortedList,它允许你通过索引和键来获取值,尽管你可能需要在构造函数中指定你自己的比较器来获得你想要的排序。然后,您可以访问Keys和Values的有序列表,并根据需要使用IndexOfKey / IndexOfValue方法的各种组合。

答案 1 :(得分:28)

像这样:

int n = 0;
int nthValue = cipher[cipher.Keys.ToList()[n]];

请注意,您还需要在页面顶部引用Linq ...

using System.Linq;

答案 2 :(得分:17)

你真的需要通过钥匙查找吗?如果没有,请使用List<KeyValuePair<char, int>>(或者更好的是,创建一个类型来封装char和int)。

字典本身并不排序 - 在.NET中排序的字典实现按键排序,而不是按插入顺序排序。

如果您需要通过插入顺序和密钥访问集合,我建议将List和Dictionary包含在单个集合类型中。

或者,如果列表很短,只需通过线性搜索即可通过索引进行查找...

答案 3 :(得分:6)

您可以像这样使用override func viewDidAppear(_ animated: Bool) { if let x = UserDefaults.standard.object(forKey: "cell") as? [String]! { list = x myTableView.reloadData() } }

declare
a number;
b number;
c number;
d number;

function findMaxOfAll(x in number, y in number, z in number)
return number
is
m number;
begin
  if x > y and x > z then
    m:=x;
     else if y > x and y > z then
       m:=y;
        else
          m:=z;
  end if;
  return m;
end;

begin
a:=34;
b:=76;
c:=56;
d:=findMaxOfAll(a, b, c);
dbms_output.put_line('Max of all is: ' || d);
end;

它比public String replaceWithPattern(String str,String replace){ Pattern ptn = Pattern.compile("(?<=preso).*"); Matcher mtch = ptn.matcher(str); return mtch.replaceAll(replace); } public static void main(String a[]){ String str = "Hello_preso1D88B7B3-FE77-7A3D-9758-C3820B6D83FB/cfslideshow.js"; PatternSearchAndReplace mpr = new PatternSearchAndReplace(); System.out.println(mpr.replaceWithPattern(str, " ")); } 选项更好,因为这样你就不必遍历字典:

文档

sudo apt-get install php7.0-pgsql

 cd /etc/postgresql/9.5/main 

 sudo nano pg_hba.conf 

local   all             postgres                                peer

should be 

local   all             postgres                                md5

sudo service postgresql restart

答案 4 :(得分:2)

为了坚持你的原始字典规范,我挂了一些代码并提出:

Dictionary<string, string> d = new Dictionary<string, string>();

d.Add("a", "apple");
d.Add("b", "ball");
d.Add("c", "cat");
d.Add("d", "dog");

int t = 0;
foreach (string s in d.Values)
{
    t++;
    if (t == 2) Console.WriteLine(s);
}

并且似乎确实将第二项(“球”)重复写入控制台。如果将它包装到方法调用中以获取第n个元素,它可能会起作用。不过,这非常难看。如果你可以做一个SortedList,正如@thecoop建议的那样,你会更好。

答案 5 :(得分:2)

这里有一个问题:How to retrieve Nth item in dictionary?。它应该很快关闭,但我注意到这里的答案缺少新的OrderedDictionary类。

现在(从.NET 4开始),有一个OrderedDictionary类。这允许在提供排序的同时快速查找。 Item(Int32)方法返回第n个元素。

答案 6 :(得分:0)

您可以在“密码”Dictionary

上应用以下LINQ查询
        var cipher = new Dictionary<char, int>();
        cipher.Add('a', 324);
        cipher.Add('b', 553);
        cipher.Add('c', 915);

        var nThValue = cipher.Select((Val, Index) => new { Val, Index })
            .Single(viPair => viPair.Index == 1)   //Selecting dictionary item with it's index using index
            .Val                                   //Extracting KeyValuePair from dictionary item
            .Value;                                //Extracting Value from KeyValuePair

答案 7 :(得分:0)

这是一个老问题,但对我有帮助。这是我使用的实现。我希望第n个元素基于插入顺序。

public class IndexedDictionary<TKey, TValue> : IEnumerable<TValue> {
  private List<TValue> list = new List<TValue>();
  private Dictionary<TKey, TValue> dict = new Dictionary<TKey, TValue>();

  public TValue this[int index] { get { return list[index]; } }
  public TValue this[TKey key] { get { return dict[key]; } }

  public Dictionary<TKey, TValue>.KeyCollection Keys { get { return dict.Keys; } }

  public int Count { get { return list.Count; } }

  public int IndexOf(TValue item) { return list.IndexOf(item);  }
  public int IndexOfKey(TKey key) { return list.IndexOf(dict[key]); } 

  public void Add(TKey key, TValue value) {
    list.Add(value);
    dict.Add(key, value);
  }

  IEnumerator<TValue> IEnumerable<TValue>.GetEnumerator() {
    return list.GetEnumerator();
  }

  IEnumerator IEnumerable.GetEnumerator() {
    return list.GetEnumerator();
  }
}