İki IEnumerable <T> 'i yeni bir IEnumerable <T> içine nasıl birleştirebilirim?


201

İki örneğim var IEnumerable<T>(aynı ile T). Her IEnumerable<T>ikisinin birleşimi olan yeni bir örnek istiyorum .

.Net'te bunu yapmak için yerleşik bir yöntem var mı yoksa bunu kendim mi yazmak zorundayım?


9
Code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b'ye yer işareti koymak isteyebilirsiniz .
C-Pound Guru

Yanıtlar:


333

Evet, LINQ to Objects bunu aşağıdakilerle destekler Enumerable.Concat:

var together = first.Concat(second);

Not: Olmalı firstveya secondboş kalmalısınız ArgumentNullException. Bunu önlemek ve null değerlerini boş bir küme gibi işlemek için null birleştirme operatörünü şu şekilde kullanın:

var together = (first ?? Enumerable.Empty<string>()).Concat(second ?? Enumerable.Empty<string>()); //amending `<string>` to the appropriate type

1
Her zaman uzatma yöntemlerini aramayı unuturum, tx.
Samuel Rossille

10
@SamuelRossille Ayrıca gerçekleştirmek istediğiniz eylemlerin adlarının, tam olarak peşinde olduğunuz şey olarak adlandırılmamışsa, yakın olduğunu unutmayın. Her zaman IntelliSense'e göz atın, çok şey öğrenirsiniz.
Adam Houldsworth

3
İkincisi = ilk yapmak kötü mü? herhangi bir eşzamanlılık sorunumuz olacak mı?
user2934433

4
@ user2934433: Hayır, kesinlikle iyi.
Jon Skeet

2
Sadece hızlı bir not. using System.Linq IDE anlaşmasında istenen uzantı yöntemini görmek için kod dosyasının üst kısmındaki ad alanını içe aktarmak gerekir .
RBT

19

ConcatYöntem uygulayan bir nesne döndürür IEnumerable<T>olan Numaralayıcı kullanmayı dener bir nesne döndürerek (Kat arama) iki geçirildi, numaralandırılabilir ürünlerinin sırayla (onları A ve B olarak adlandırılır). İçerideki numaralandırıcılar, Cat'in ömrü boyunca değişmeyecek ve yan etkiler olmadan okunabilecek sekansları temsil ediyorsa, Cat doğrudan kullanılabilir. Aksi takdirde, çağrı için iyi bir fikir olabilir ToList()üzerinde Catve elde edilen kullanın List<T>(A ve B içeriğinin temsil edecek bir anlık).

Bazı numaralandırmalar numaralandırma başladığında bir anlık görüntü alır ve numaralandırma sırasında koleksiyon değiştirilirse bu anlık görüntüden veri döndürür. B bu kadar numaralandırılabilir ise, Cat'in A'nın sonuna gelmeden önce gerçekleşen B'deki herhangi bir değişiklik, Cat'in numaralandırmasında görünecektir, ancak bundan sonra meydana gelen değişiklikler olmayacaktır. Bu tür anlambilim muhtemelen kafa karıştırıcı olabilir; Cat'in anlık görüntüsünü almak bu tür sorunları önleyebilir.


7

Çözümünüz için aşağıdaki kodu kullanabilirsiniz: -

public void Linq94() 
{ 
    int[] numbersA = { 0, 2, 4, 5, 6, 8, 9 }; 
    int[] numbersB = { 1, 3, 5, 7, 8 }; 

    var allNumbers = numbersA.Concat(numbersB); 

    Console.WriteLine("All numbers from both arrays:"); 
    foreach (var n in allNumbers) 
    { 
        Console.WriteLine(n); 
    } 
}

0
// The answer that I was looking for when searching
public void Answer()
{
    IEnumerable<YourClass> first = this.GetFirstIEnumerableList();
    // Assign to empty list so we can use later
    IEnumerable<YourClass> second = new List<YourClass>();

    if (IwantToUseSecondList)
    {
        second = this.GetSecondIEnumerableList();  
    }
    IEnumerable<SchemapassgruppData> concatedList = first.Concat(second);
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.