Как вы используете строку в качестве индекса? - PullRequest
7 голосов
/ 10 сентября 2010

Утро.

Проблема:
У меня есть класс, который называется Отчеты.Два конструктора.Один не позволяет никаких параметров, другой массив строк.Строковый массив должен представлять собой отчеты, которые они хотели бы отображать.Я хотел бы сделать следующее:

string strSQL = this.Queries[strReportName];

У меня такое ощущение, что это возможно, потому что в используемом мной dataGridView я получаю индекс столбца по:

int nColumnIndex = dgvParts.Columns[strColumnName].Index;

В обоих этих примерах используется строка, чтобы определить, какое значение в массиве они получают, но я не уверен, как это сделать.Кто-нибудь может мне помочь?Любая помощь приветствуется.

Для редакторов и модов: Да, часть отчетов слабо связана с другим постом, который у меня есть о динамической загрузке DLL, но я хотел бы оставить другой открытым.Мы с моим боссом решили на короткий срок, что у нас будет только одна DLL, и все будет жестко запрограммировано, но в долгосрочной перспективе мы хотим динамически добавлять DLL в качестве отчетов, поэтому, пожалуйста, не отмечайте это как дубликат.Я планирую на этих выходных попробовать и методы, данные мне в другой ветке.Спасибо.

Редактировать - часть 2 вопроса : Хорошо, вот мой класс, как он есть сейчас:

public class Queries
{
  #region Report Queries
    #region Missing Code
      string strMissingCode = "SELECT * FROM PARTS WHERE CODE IS NULL OR CODE = ''";
    #endregion
  #endregion
}

Я хотел бы изменить его начто-то вроде этого:

public class Queries : Dictionary<string, string>
{
}

Но я не хочу, чтобы им приходилось использовать конструктор для его создания.Мне нужна статическая сортировка, чтобы я мог запускать такой код:

class Reports
{
  private List<ReportRecord> _lstRecrods = new List<ReportRecord>();
  public List<ReportRecord> Records { get { return _lstRecords; } }

  public Reports(string[] strDisplayedReports)
  {
    foreach (string strReportTitle in strDisplayedReports)
    {
      this.BuildReportList(strReportTitle);
    }
  }

  private void BuildReportList(string strReportTitle)
  {
    using (DataSet ds = Database.GetDataSet(Queries[strReportTitle]))
    {
      ...
    }
  }
}

Как мне сделать статическую сортировку там, где мне не нужно создавать экземпляры Queries?Спасибо, ребята и девочки.

Ответы [ 6 ]

14 голосов
/ 10 сентября 2010

Я думаю, вы ищете что-то вроде следующего:

public class Reports
{
    System.Collections.Generic.IDictionary<string,string> queries;

    public string this[string key]
    {
        get
        {
            return this.queries[key];
        }
    }
}

См. http://msdn.microsoft.com/en-us/library/aa288464(VS.71).aspx для получения дополнительной информации.

Если вам не нужно добавлять какие-либобольше функциональности для вашего класса «Отчеты», а затем просто используйте словарь, который опубликовали другие.

10 голосов
/ 10 сентября 2010

A Словарь может использовать строки в качестве "индекса" (на самом деле ключ).

2 голосов
/ 10 сентября 2010

Посмотрите на словарь и iDictionary

http://msdn.microsoft.com/en-us/library/xfhwa508.aspx

0 голосов
/ 10 сентября 2010

Вы можете использовать Array.IndexOf (this.Queries, strReportName);

0 голосов
/ 10 сентября 2010

базовые массивы в c # основаны на индексах и не могут использовать строковые методы доступа.

Это работает:

string[] someArray = {"query 1", "query 2"};
string myQuery = someArray[1];

Это не так:

myQuery = someArray["some value"];

Используйте класс Dictionary , который позволяет использовать ключи любого типа, включая сложные типы.

0 голосов
/ 10 сентября 2010

this.Queries.SingleOrDefault (x => x.Name == strReportName) не будет работать? Если нет, вы можете создать метод расширения, который скрыл бы этот код в индексаторе []

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...