试图将illist转换为List以便AddRange

本文关键字:List 以便 AddRange 转换 illist | 更新日期: 2023-09-27 18:12:15

我有一个IList。我试着打电话给ToList,然后是AddRange

但是,ToList()覆盖了所有的结果。怎么会?

private void AddAliasesThatContainsCtid(string ctid, IList<MamConfiguration_V1> results)
{
...
    foreach (var alias in aliases)
    {
        var aliasId = "@" + alias;
    results.ToList().AddRange(mMaMDBEntities.MamConfigurationToCTIDs_V1.Where(item => item.CTID == aliasId)
                             .Select(item => item.MamConfiguration_V1)
                             .ToList());
    }
}

试图将illist转换为List以便AddRange

.ToList()不会将IEnumerable<T>转换为List<T>,它创建并返回一个包含可枚举对象值的新列表。

所以你的result.ToList()将创建一个新的列表,并填充一些数据。但是它不会改变result形参引用的对象的内容。

为了实际改变result参数的内容,你必须使用它的.Add方法,或者如果你的设计允许,它可以将result的类型更改为List<..>

你的代码是等价的:

// Create new List by calling ToList()
var anotherList = results.ToList();
anotherList.AddRange(...);

所以,你实际上是在anotherList列表中添加项目,而不是result列表。

要得到正确的结果,有两种方法:

1:

声明resultsout并赋值:

results = anotherList;

或:

results = results.ToList().AddRange(...)

2:

使用IList支持的Add方法代替AddRange

很简单:

public static class ListExtensions
{
    public static IList<T> AddRange<T>(this IList<T> list, IEnumerable<T> range)
    {
        foreach (var r in range)
        {
            list.Add(r);
        }
        return list;
    }
}

虽然IList<T>没有AddRange(),但它 Add(),所以您可以IList<T>编写一个扩展方法,使您可以向其添加一个范围。

如果你这样做,你的代码将变成:

private void AddAliasesThatContainsCtid(string ctid, IList<MamConfiguration_V1> results)
{
...
    results.AddRange(mMaMDBEntities.MamConfigurationToCTIDs_V1
        .Where(item => item.CTID == aliasId)
        Select(item => item.MamConfiguration_V1));
   }
}

可编译的示例实现:

using System;
using System.Collections.Generic;
using System.Linq;
namespace Demo
{
    internal class Program
    {
        static void Main()
        {
            IList<string> list = new List<string>{"One", "Two", "Three"};
            Print(list);
            Console.WriteLine("---------");
            var someMultiplesOfThree = Enumerable.Range(0, 10).Where(n => (n%3 == 0)).Select(n => n.ToString());
            list.AddRange(someMultiplesOfThree); // Using the extension method.
            // Now list has had some items added to it.
            Print(list);
        }
        static void Print<T>(IEnumerable<T> seq)
        {
            foreach (var item in seq)
                Console.WriteLine(item);
        }
    }
    // You need a static class to hold the extension method(s):
    public static class IListExt
    {
        // This is your extension method:
        public static IList<T> AddRange<T>(this IList<T> @this, IEnumerable<T> range)
        {
            foreach (var item in range)
                @this.Add(item);
            return @this;
        }
    }
}
相关文章: