试图将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());
}
}
.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:
声明results
为out
并赋值:
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;
}
}
}