2014-02-21 2 views
0

Я строю список:Как добавить N элементов в список?

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

Здесь myList есть М элементов (M = myList.Count())

мне нужно добавить N элементы MyList так, что myList есть СУММА элементов, в другом слова N+M = TOTAL.

Как это сделать?

+2

Где вы получаете N элементов из? –

+3

Сделать простой цикл? – poke

ответ

1

Это получит «n» элементов от myOtherList и добавит их в myList.

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

Хорошая вещь о Take том, что если не хватает элементов в myOtherList, это не вызовет ошибку - это просто получить все элементы.

Если счетчик превышает число элементов в источнике , все элементы источника возвращаются.

Если счетчик меньше или равна нулю, источник не пронумерован и пустой IEnumerable возвращается.

+0

Взять определенно путь. Не думал об этом. – Tarec

2

Просто продолжайте добавлять новые элементы, пока не упретесь нужного размера:

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

OP хочет подход Linq –

+3

Где вы берете это? Это не очевидно для меня; и простой цикл, безусловно, более простой и более прямой подход здесь. – poke

+0

из тегов и способа, которым он пытается это сделать –

-1

Попробуйте

myList.AddRange() 

это используется для добавления списка в существующий список. (Он будет работать с любым IEnumerable того же типа, что и существующий список).

Отмечено ... ooooh Я не понимал, что нам нужно написать целые решения для людей, и я подумал,

2

LINQ подход:

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

только не забудьте проверить, является ли myList.Count меньше TOTAL и myList2 имеет достаточно элементов.

1

Вот полный пример illustratting, как вы можете добиться этого с помощью одной строки кода

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; } 
    } 
} 
0

Вы можете использовать myList.AddRange() с ограниченный список в параметре или используйте myList.Add() в ForEach Linq.

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)); 
} 
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, исключение throwen.
  • Если количество единиц в 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" 
Смежные вопросы