patterncsharpMinor
Joining two IEnumerable<T>
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
I don't want to convert any
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:
Without ToList():
In your NodeMerge method:
// 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.