1

我有一个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());
    }

}
4

4 回答 4

5

.ToList()不会将 an 转换IEnumerable<T>为 a List<T>,它会创建并返回一个新列表,其中填充了可枚举的值。

因此,您result.ToList()将创建一个新列表并用一些数据填充它。但它不会改变结果参数引用的对象的内容。

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

于 2013-05-05T08:51:10.650 回答
2

您的代码是等效的:

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

因此,您实际上将项目添加到anotherList中,而不是result列表中。

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

1:

声明resultsout并分配回:

results = anotherList;

或者:

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

2:

使用代替Add支持的方法IListAddRange

于 2013-05-05T08:57:09.540 回答
1

这很简单:

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;
    }
}
于 2013-05-05T09:01:57.830 回答
0

虽然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;
        }
    }
}
于 2013-05-05T09:09:30.577 回答