Home > Mobile >  Is there a LINQ operator to do this?
Is there a LINQ operator to do this?

Time:02-05

I would like to know if there's a LINQ operator to do this:

var one = new[] { "A", "B", "C" };
var two = new[] { "A", "B", "C", "D" };
var combined = new [] { one, two };

var result = Operator(combined);

Console.WriteLine(result.Should().BeEquivalentTo(new [] { "A", "A", "B", "B", "C", "C", null, "D" }));

CodePudding user response:

How about something like this:

public static IEnumerable<T> KnitArrays<T>(T[] first, T[] second) 
{
    var maxLen = Math.Max(first.Length, second.Length);
    for (var i = 0; i < maxLen; i  )
    {
        yield return first.Length > i ? first[i] : default(T);
        yield return second.Length > i ? second[i] : default(T);
    }
}

Testing this with:

var one = new[] { "A", "B", "C" };
var two = new[] { "A", "B", "C", "D" };

var knittedArray = KnitArrays(one, two);
List<string> result = knittedArray.ToList();

yields a list that looks like what you are asking. Note that I just return a non-materialized IEnumerable since you were asking about LINQ.

CodePudding user response:

try this

var result = Enumerable.Range(0, Math.Max(one.Count(), two.Count()))
.SelectMany(n => new[] { one.ElementAtOrDefault(n), two.ElementAtOrDefault(n) });

result

["A","A","B","B","C","C",null,"D"]
  •  Tags:  
  • Related