如何将N个元素附加到List?

时间:2014-02-21 12:52:34

标签: c# linq lambda

我建立了一个清单:

int TOTAL = 10;
List<MyObject> myList = myOtherList.Select
            (s => new MyObject
            {
                Prop1 = s.prop1
            })
            .ToList<MyObject>();

这里myList有M个元素(M = myList.Count())

我需要将N元素附加到myList,以便myList具有TOTAL元素,换句话说N+M = TOTAL

我怎样才能完成它?

7 个答案:

答案 0 :(得分:2)

只需不断添加新商品,直至达到所需尺寸:

while (myList.Count < TOTAL)
{
    myList.Add(NewItem);
}

答案 1 :(得分:2)

LINQ方法:

myList.AddRange(Enumerable.Range(0, TOTAL - myList.Count).Select(i => myList2[i]));

请记住检查myList.Count是否小于TOTAL,myList2是否有足够的元素。

答案 2 :(得分:1)

这将从myOtherList获取“n”个元素并将其添加到myList

myList.AddRange(myOtherList.Select(s => new MyObject { Prop1 = s.prop1 }).Take(n));

关于Take的好处是,如果myOtherList中没有足够的元素,它就不会导致错误 - 它只会获取所有元素。

  

如果 count 超过 source 中的元素数量,则会返回 source 的所有元素。

     

如果 count 小于或等于零,则不会枚举 source 并返回空的IEnumerable。

答案 3 :(得分:1)

这里有一个完整的例子,说明如何通过一行代码实现这一目标

list.AddRange(list2.Take(total - list.Count));

完整示例

internal class Program
{
    private static void Main(string[] args)
    {           
        List<MyObject> list = new List<MyObject>();

        for (int i = 0; i < 5; i++)
        {
            list.Add(new MyObject() {Id = i}
                );
        }

        List<MyObject> list2 = new List<MyObject>();

        for (int i = 0; i < 5; i++)
        {
            list2.Add(new MyObject() {Id = i});
        }

        int total = 10;
        list.AddRange(list2.Take(total - list.Count));
    }

    class MyObject
    {
        public int Id { get; set; }
    }
}

答案 4 :(得分:0)

您可以在参数中使用myList.AddRange()和限制列表,或者在ForEach Linq中使用myList.Add()。

int TOTAL = 10;
List<MyObject> myList = something;
if (myList < TOTAL)
{
    myOtherList.Select
        (s => new MyObject
        {
            Prop1 = s.prop1
        })
        .ToList<MyObject>()
        .Take(TOTAL - myList.Count)
        .ForEach(ob => myList.Add(ob));
}

int TOTAL = 10;
List<MyObject> myList = something;
if (myList < TOTAL)
{
    myList.AddRange(myOtherList.Select
        (s => new MyObject
        {
            Prop1 = s.prop1
        })
        .ToList<MyObject>()
        .Take(TOTAL - myList.Count));
}

答案 5 :(得分:0)

怎么样:

public static IEnumerable<T> ConcatN<T>(this IEnumerable<T> source, IEnumerable<T> source2, int maxSize)
{
    if (maxSize == 0)
        throw new ArgumentException(
            "maxSize cannot be zero", "maxSize");

    var sourceCount = source.Count();

    if (sourceCount > maxSize)
        throw new ArgumentException(
            "source has more elements than the given maxSize");

    if (sourceCount + source2.Count() < maxSize)
        throw new ArgumentOutOfRangeException(
            "source and source2 has combined, more elements than the given maxSize");

    return source.Concat(source2.Take(maxSize - sourceCount));
}
  
      
  • 如果source中的项目数超过给定的maxSize,则会引发异常。
  •   
  • 如果source + source2中的项目数量少于给定的maxSize,则会引发异常。
  •   

用法:

var number1 = Enumerable.Range(0, 10);
var number2 = Enumerable.Range(100, 10);

var number12 = number1.ConcatN(number2, 15);

Console.WriteLine("Length = {0} | Sum = {1}",
    number12.Count(), number12.Sum());

// Output: "Length = 15 | Sum = 555"

答案 6 :(得分:-1)

尝试

myList.AddRange()

这用于将列表添加到现有列表中。 (它适用于任何与现有列表相同类型的IEnumerable。)

标记下来......哦,我没有意识到我们必须为人们编写完整的解决方案,而且我认为当我可以使用堆栈溢出而不是我的大脑时,我花了10年时间学习软件开发是明智的/ p>