Подтвердить что ты не робот

Установить массив как строку не int?

Я пытаюсь установить ключи массива как строки, как в примере ниже, но в C#.

<?php
$array = array();
$array['key_name'] = "value1";
?>
4b9b3361

Ответ 1

Ближе всего вы на С# Dictionary<TKey, TValue>:

var dict = new Dictionary<string, string>();
dict["key_name"] = "value1";

Обратите внимание, что a Dictionary<TKey, TValue> не совпадает с ассоциативным массивом PHP, потому что он доступен только одному типу ключа (TKey - string в приведенном выше примере), в отличие от комбинации из целых/целых ключей (спасибо Павлу за разъяснение этого момента).

Тем не менее, я никогда не слышал, чтобы разработчик .NET жаловался на это.


В ответ на ваш комментарий:

// The number of elements in headersSplit will be the number of ':' characters
// in line + 1.
string[] headersSplit = line.Split(':');

string hname = headersSplit[0];

// If you are getting an IndexOutOfRangeException here, it is because your
// headersSplit array has only one element. This tells me that line does not
// contain a ':' character.
string hvalue = headersSplit[1];

Ответ 2

Uhm Я предполагаю, что вы хотите словарь:

using System.Collections.Generic;

// ...

var dict = new Dictionary<string, string>();
dict["key_name1"] = "value1";
dict["key_name2"] = "value2";
string aValue = dict["key_name1"];

Ответ 3

Вы можете использовать Dictionary<TKey, TValue>:

Dictionary<string, string> dictionary = new Dictionary<string, string>();
dictionary["key_name"] = "value1";

Ответ 4

Попробуйте словарь:

var dictionary = new Dictionary<string, string>();
dictionary.Add("key_name", "value1");

Ответ 5

Вы также можете использовать KeyedCollection http://msdn.microsoft.com/en-us/library/ms132438%28v=vs.110%29.aspx, где ваше значение является сложным типом и имеет уникальное свойство.

У вас есть наследование коллекции из KeyedCollection, пример...

    public class BlendStates : KeyedCollection<string, BlendState>
    {
    ...

Это требует, чтобы вы переопределили метод GetKeyForItem.

    protected override string GetKeyForItem(BlendState item)
    {
        return item.DebugName;
    }

Затем в этом примере коллекция индексируется по строкам (имя отладки BlendState):

    OutputMerger.BlendState = BlendStates["Transparent"];

Ответ 6

Поскольку все остальные словаря, я решил ответить на 2 массива. Один массив будет индексом в другой.

Вы не указали тип данных, который вы найдете в определенном индексе, поэтому я пошел дальше и выбрал строку для моего примера.

Вы также не указали, хотите ли вы изменить размер позже. Если вы это сделаете, вы должны использовать List<T> вместо T [], где T - тип, а затем просто выставлять некоторые общедоступные методы для добавления для каждого списка, если это необходимо.

Вот как вы могли это сделать. Это также можно было бы изменить, чтобы передать возможные индексы конструктору или сделать его, тем не менее, вы сделаете это.

class StringIndexable
{
//you could also have a constructor pass this in if you want.
       public readonly string[] possibleIndexes = { "index1", "index2","index3" };
    private string[] rowValues;
    public StringIndexable()
    {
        rowValues = new string[ColumnTitles.Length];
    }

    /// <summary>
    /// Will Throw an IndexOutofRange Exception if you mispell one of the above column titles
    /// </summary>
    /// <param name="index"></param>
    /// <returns></returns>
    public string this [string index]
    {
        get { return getOurItem(index); }
        set { setOurItem(index, value); }


    }

    private string getOurItem(string index)
    {
        return rowValues[possibleIndexes.ToList().IndexOf(index.ToLower())];

    }
    private void setOurItem(string index, string value)
    {
        rowValues[possibleIndexes.ToList().IndexOf(index.ToLower())] = value;
    }

}

Затем вы вызываете его так:

  StringIndexable YourVar = new YourVar();
  YourVar["index1"] = "stuff";
  string myvar = YourVar["index1"];