我正在尝试在继承自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报告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;
    }
    

    [已解决(简短版)]

    乔恩·斯凯特(Jon Skeet)在我发布解决方案的同一时间发布了此内容,并且(一如既往)他的代码更好。
    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:如果我在我申请的某个软件开发人员职位上看到你的脸在同一行,我将转身回家。

    @每个人:谢谢您的所有帮助!

    最佳答案

    这样的查询结果不是List<T>,而是IEnumerable<T>。如果要将其转换为List<T>,只需调用ToList:

    List<RowData> rowList = (from item in Rows
                             where item[colName].Value == value
                             select item).ToList();
    

    碰巧的是,您仅在查询中调用Where。我将其重写为:
    List<RowData> rowList = Rows.Where(item => item[colName].Value.Equals(value))
                                .ToList();
    

    考虑到后者是LINQ中“选择”一词的更常用用法,我还将方法重命名为显然是过滤而不是投影的方法。

    至于输入参数-我建议您验证参数并在无效的情况下抛出异常:
    if (string.IsNullOrEmpty(colName))
    {
        throw new ArgumentException("colName");
    }
    

    关于C#-LINQ从集合中选择,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6668005/

    10-16 21:40