c # - LINQ select from Collection

Я пытаюсь написать простой метод Select для класса, наследуемого от IList .

public class RowDataCollection : IList<RowData> {
  private List<RowData> rowList;

  internal RowDataCollection(List<RowData> data) {
    rowList = data;
  }
  // ...
}

public RowDataCollection Rows;

public RowDataCollection Select(string colName, object value) {
  List<RowData> rowList = from item in Rows
         where item[colName].Value == value
         select item;
  return new RowDataCollection(rowList);
}

У меня есть некоторые проблемы:

Первый:

  • Отчеты VS2010 Невозможно неявно преобразовать тип IEnumerable в List . Существует явное преобразование (вам не хватает приведений?)

Хорошо, куда идет CAST?

Второе:

  • Кто-то мог передать недопустимое значение colName (например, String.IsNullOrEmpty (colName) ) или нулевой параметр (значение объекта == null) .

Как мне обработать способ возврата моей функции, если входные параметры недействительны?

[Решено]

Я отредактировал свой оператор Select (даже переименовал его в соответствии с предложенными здесь предложениями). Мне пришлось использовать переключатель для приведения к типу данных, в котором были данные, но он работает.

public RowDataCollection SelectRow(string colName, object value) {
  if (!String.IsNullOrEmpty(colName) && (value != null) && (0 < Rows.Count)) {
    switch (Rows[0][colName].GetValueType()) {
      case TableDataType.Boolean:
        return new RowDataCollection(Rows.Where(r => (bool)r[colName].Value == (bool)value).ToList());
      case TableDataType.Character:
        return new RowDataCollection(Rows.Where(r => (char)r[colName].Value == (char)value).ToList());
      case TableDataType.DateTime:
        return new RowDataCollection(Rows.Where(r => (DateTime)r[colName].Value == (DateTime)value).ToList());
      case TableDataType.Decimal:
        return new RowDataCollection(Rows.Where(r => (Decimal)r[colName].Value == (Decimal)value).ToList());
      case TableDataType.Integer:
        return new RowDataCollection(Rows.Where(r => (int)r[colName].Value == (int)value).ToList());
      case TableDataType.String:
        return new RowDataCollection(Rows.Where(r => r[colName].Value.ToString() == value.ToString()).ToList());
    }
  }
  return null;
}

[Решено (краткая версия)]

Джон Скит опубликовал это примерно в то же время, когда я опубликовал свое решение, и (как всегда) его код намного лучше.

public RowDataCollection SelectRow(string colName, object value) {
  List<RowData> rowList = Rows.Where(r => r[colName].Value.Equals(value)).ToList();
  return new RowDataCollection(rowList);
}

@Jon Skeet: Если я когда-нибудь увидеть ваше лицо в той же строке на какой-то должности разработчика программного обеспечения, на которую я претендую, я просто повернусь и пойду домой.

@Everyone : Спасибо за помощь!

9
задан jp2code 12 July 2011 в 21:50
поделиться