将linq连接的左侧或右侧填充为相同的行数

paq*_*mez 3 c# linq sorting

我的目标是创建一个与右侧或左侧相同行数的列表,而不管左列或右列是否比另一列短.

考虑这两个查询:

var result1 = (from f in list2
               join b in list1 on f.index equals b.index into bf
               from x in bf.DefaultIfEmpty()
               select new { box = (x == null ? String.Empty : x.b), file = f.f });

var result2 = (from b in list1
              join f in list2 on b.index equals f.index into bf
              from x in bf.DefaultIfEmpty()
              select new { l1 = x.f, l2 = (x == null ? String.Empty : b.b) });
Run Code Online (Sandbox Code Playgroud)

一个在list1上测试null并填充一个空字符串,另一个在list2上测试null并填充一个空字符串.

我想找一个两者都可能发生的例子.顺序并不重要,只是左边的每个值或空字符串都有一个值或右边的空字符串.

Sph*_*xxx 5

看起来你需要一个IEnumerable.Zip扩展方法的版本,当较短的列表到达它的末尾时它不会停止:

public static IEnumerable<TResult> ZipAll<T, TResult>(this IEnumerable<T> list1,
                                                           IEnumerable<T> list2,
                                                           Func<T, T, TResult> zipper,
                                                           T defaultValue = default(T))
{
    using (var enum1 = list1.GetEnumerator())
    {
        using (var enum2 = list2.GetEnumerator())
        {

            bool valid1, valid2;
            do
            {
                valid1 = enum1.MoveNext();
                valid2 = enum2.MoveNext();
                if (valid1 || valid2)
                {
                    var item1 = valid1 ? enum1.Current : defaultValue;
                    var item2 = valid2 ? enum2.Current : defaultValue;

                    yield return zipper(item1, item2);
                }
            }
            while (valid1 || valid2);

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

..然后:

var result = list1.ZipAll(list2, (l1, l2) => new { l1, l2 }, string.Empty);
Run Code Online (Sandbox Code Playgroud)