【问题标题】:Add one list to another in C#在 C# 中将一个列表添加到另一个列表
【发布时间】:2015-06-05 03:06:06
【问题描述】:

我正在尝试将一个列表添加到另一个列表中。所以我有这个我要建立的主要清单。我遍历记录并建立了一个列表,并且每次循环时都希望这个列表成为主列表。我正在尝试在 C# 中执行此操作。 我正在使用以下代码。 Add() 函数不起作用。我收到语法错误。

 IList<CgValDetail> cgValDetail = null;
            //Get cgValDetails for each control
            foreach (UiControlScreenMetaData tempUiControls in uiControls)
            {
                if (tempUiControls.CgValId == null)
                {
                    continue;
                }
                IList<CgValDetail> tempCgValDetail = Retrieval<CgValDetail>.Search(new { CgValId = tempUiControls.CgValId }).ToList();
                if (!tempCgValDetail.Any())
                {
                    _foundationService.LogBusinessError(null, new ParameterBuilder("CgValId", tempUiControls.CgValId), "Invalid_CgValId_found");
                    return false;
                }
                //Add tempCgValDetail List to main list which is cgValDetail
                cgValDetail.Add(tempCgValDetail);


            }

【问题讨论】:

  • 您在寻找 AddRange 吗? cgValDetail.AddRange(tempCgValDetail);
  • 我尝试使用它,但出现构建错误提示:cgValDetail 不包含 AddRange() 的定义
  • 没有注意到它是一个 IList。您不能在 IList 上使用 AddRange。你为什么使用 IList 而不是 List?
  • @Fragment 如果您不考虑使用 IList(除了添加到 null),那将是正确的。

标签: c# foreach ilist


【解决方案1】:

看看 AddRange。

var firstList = new List<string>();
var secondList = new List<string>() { "a", "b" };

firstList.AddRange(secondList);

您提到您无权访问 AddRange...问题是您使用的是 IList,它没有实现 AddRange。查看此内容以了解更多原因:Why doesn't IList support AddRange

我建议你切换到 List。

【讨论】:

    【解决方案2】:

    首先,您需要将 cgValDetail 实例化为一个新列表,而不是 null。

    然后您应该决定是否要将 cgValDetail 声明为 IList 而不是 List。如果是,试试这个:

    IList<CgValDetail> cgValDetail = new List<CgValDetail>();
    //Get cgValDetails for each control
    foreach (UiControlScreenMetaData tempUiControls in uiControls)
    {
        if (tempUiControls.CgValId == null)
        {
            continue;
        }
        IList<CgValDetail> tempCgValDetail = Retrieval<CgValDetail>.Search(new { CgValId = tempUiControls.CgValId }).ToList();
        if (!tempCgValDetail.Any())
        {
            _foundationService.LogBusinessError(null, new ParameterBuilder("CgValId", tempUiControls.CgValId), "Invalid_CgValId_found");
            return false;
        }
        //Add tempCgValDetail List to main list which is cgValDetail
        ((List<CgValDetail>)cgValDetail).AddRange(tempCgValDetail);
    }
    

    但我想知道为什么不使用 List 而不是 IList。

    List<CgValDetail> cgValDetail = new List<CgValDetail>();
    //Get cgValDetails for each control
    foreach (UiControlScreenMetaData tempUiControls in uiControls)
    {
        if (tempUiControls.CgValId == null)
        {
            continue;
        }
        List<CgValDetail> tempCgValDetail = Retrieval<CgValDetail>.Search(new { CgValId = tempUiControls.CgValId }).ToList();
        if (!tempCgValDetail.Any())
        {
            _foundationService.LogBusinessError(null, new ParameterBuilder("CgValId", tempUiControls.CgValId), "Invalid_CgValId_found");
            return false;
        }
        //Add tempCgValDetail List to main list which is cgValDetail
        cgValDetail.AddRange(tempCgValDetail);
    }
    

    【讨论】:

      【解决方案3】:

      您的cgValDetail 为空。这就是为什么当你添加(...)时,你会得到语法错误。

      创建一个新的IList&lt;CgValDetail&gt;

      IList<CgValDetail> cgValDetail = new List<CgValDetail>();
      

      你为什么不使用List&lt;T&gt; 而不是IList&lt;T&gt;

      【讨论】:

      • 您将如何创建interface 的实例?
      【解决方案4】:

      你忘记更新了。

      只是一个简单的例子:

      List<a> aList= new List<a>();
      List<aList> List_aList = new List<aList>();
      List_aList.add(new aList());
      

      Here同一问题的链接。

      【讨论】:

      • 在您尝试为接口创建实例的代码中,代码将无法编译。
      【解决方案5】:

      也许,您可以在 Linq 中使用“UNION”(如果您不真正关心性能或结果集不够大)。

      cgValDetail.Add(tempCgValDetail);   
      

      改成

      cgValDetail = cgValDetail.Union(tempCgValDetail.Select(a => a)).ToList();
      

      【讨论】:

        猜你喜欢
        • 2021-08-18
        • 2020-01-23
        • 1970-01-01
        • 1970-01-01
        • 2022-06-13
        • 2015-07-22
        • 1970-01-01
        • 2018-03-06
        • 1970-01-01
        相关资源
        最近更新 更多