HiveBrain v1.2.0
Get Started
← Back to all entries
patterncsharpMinor

Joining two IEnumerable<T>

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
twojoiningienumerable

Problem

I'm trying to merge two nodes. Basically, the idea is to take all children in left and new ones in right. Is there any way to get rid of toAdd variable and do it in a clean way?

I don't want to convert any IEnumerable to List or Array in this merge process.

public IEnumerable NodeMerge(TNode left, TNode right,
Func> getChildren, Func getKey)
{
    var lChildren = getChildren(left);
    var rChildren = getChildren(right);

    IEnumerable[] toAdd = new IEnumerable[2];

    // Common Keys between left and right
    toAdd[0] = lChildren.Where(s => rChildren.Select(p => getKey(p)).Contains(getKey(s)));

    // new keys added to right
    toAdd[1] = rChildren.Where(s => lChildren.Select(p => getKey(p)).Contains(getKey(s)) == false);

    return toAdd.SelectMany(s => s);
}

Solution

Little cleaner:

// Common Keys between left and right
var result = lChildren.Where(s => rChildren.Select(p => getKey(p)).Contains(getKey(s))).ToList();

// new keys added to right
result.AddRange(rChildren.Where(s => lChildren.Select(p => getKey(p)).Contains(getKey(s)) == false));

return result;


Without ToList():

public static IEnumerable Merge(this IEnumerable first, IEnumerable second)
{
    foreach (var item in first)
        yield return item;

    foreach (var item in second)
        yield return item;
}


In your NodeMerge method:

return lChildren.Where(s => rChildren.Select(p => getKey(p)).Contains(getKey(s))).Merge(rChildren.Where(s => lChildren.Select(p => getKey(p)).Contains(getKey(s)) == false));

Code Snippets

// Common Keys between left and right
var result = lChildren.Where(s => rChildren.Select(p => getKey(p)).Contains(getKey(s))).ToList();

// new keys added to right
result.AddRange(rChildren.Where(s => lChildren.Select(p => getKey(p)).Contains(getKey(s)) == false));

return result;
public static IEnumerable<T> Merge<T>(this IEnumerable<T> first, IEnumerable<T> second)
{
    foreach (var item in first)
        yield return item;

    foreach (var item in second)
        yield return item;
}
return lChildren.Where(s => rChildren.Select(p => getKey(p)).Contains(getKey(s))).Merge(rChildren.Where(s => lChildren.Select(p => getKey(p)).Contains(getKey(s)) == false));

Context

StackExchange Code Review Q#13783, answer score: 3

Revisions (0)

No revisions yet.