Я пытаюсь написать простой 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);
}
У меня проблемы:
First:
- Отчеты VS2010
Cannot implicitly convert type 'IEnumerable<RowData>' to 'List<RowData>'. An explicit conversion exists (are you missing a cast?)
Хорошо, куда уходит CAST?
Второе:
- Кто-то может передать недопустимое значение
colName
(то есть String.IsNullOrEmpty(colName)
) или нулевой параметр (object value == 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);
}
@ Джон Скит: Если я когда-нибудь увижу ваше лицо в одной строке в какой-то должности разработчика программного обеспечения, на которую я претендую, я просто поверну и уйду домой.
@ Все : Спасибо за помощь!