Я пытаюсь написать простой метод 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);
}
У меня есть некоторые проблемы:
Первый:
Невозможно неявно преобразовать тип 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 : Спасибо за помощь!