且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

合并多个列表与LINQ一个列表

更新时间:2023-11-23 11:53:46

你基本上试图拉上三个集合。如果只LINQ 邮编()方法支持的两个以上的同时压缩和解了。但很可惜,它仅支持只有两个在同一时间。但是我们可以让它工作:

  VAR红魔=新的List< INT> {0×00,×03,0×06,0×08,×09};
无功果岭=新的List< INT> {0×00,0×05,0×06,0×07,的0x0A};
VAR蓝色=新的List< INT> {0×00,0×02,×03,0×05,×09};VAR颜色=
    reds.Zip(greens.Zip(蓝调,Tuple.Create)
        (红,元组)=>新的RGB(红,tuple.Item1,tuple.Item2)
    )
    .ToList();

当然,这并不十分痛苦的写了一个扩展方法做到三个(或更多)。

 公共静态的IEnumerable< TResult>邮编及LT; TFirst,TSecond,TThird,TResult>(
    这IEnumerable的< TFirst>第一,
    IEnumerable的< TSecond>第二,
    IEnumerable的< TThird>第三,
    FUNC< TFirst,TSecond,TThird,TResult> resultSelector)
{
    使用(VAR enum1 = first.GetEnumerator())
    使用(VAR enum2 = second.GetEnumerator())
    使用(VAR enum3 = third.GetEnumerator())
    {
        而(enum1.MoveNext()及&放大器; enum2.MoveNext()及&放大器; enum3.MoveNext())
        {
            产量返回resultSelector(
                enum1.Current,
                enum2.Current,
                enum3.Current);
        }
    }
}

这使事情有更多更好的:

  VAR颜色=
    reds.Zip(绿色,蓝色,
        (红色,绿色,蓝色)= GT;新的RGB(红,绿,蓝)
    )
    .ToList();

Is there a slick way to merge multiple Lists into a single List using LINQ to effectively replicate this?

public class RGB
{
    public int Red { get; set; }
    public int Green { get; set; }
    public int Blue { get; set; }
    public RGB(int red, int green, int blue) { Red = red; Green = green; Blue = blue; }
}

public void myFunction()
{
    List<int> red = new List<int> { 0x00, 0x03, 0x06, 0x08, 0x09 };
    List<int> green = new List<int> { 0x00, 0x05, 0x06, 0x07, 0x0a };
    List<int> blue = new List<int> { 0x00, 0x02, 0x03, 0x05, 0x09 };

    List<RGB> colors = new List<RGB>();

    colors.Add(new RGB(red[0], green[0], blue[0]));
    colors.Add(new RGB(red[1], green[1], blue[1]));
    colors.Add(new RGB(red[2], green[2], blue[2]));
    colors.Add(new RGB(red[3], green[3], blue[3]));
    colors.Add(new RGB(red[4], green[4], blue[4]));
}

Or, since the lists arrive separately, its more effective to merge them sequentially like the following.

public class RGB
{
    public int Red { get; set; }
    public int Green { get; set; }
    public int Blue { get; set; }

    public RGB(int red, int green, int blue) { Red = red; Green = green; Blue = blue; }
}

public void myFunction()
{
    List<int> red = new List<int> { 0x00, 0x03, 0x06, 0x08, 0x09 };

    List<RGB> colors = new List<RGB>();

    colors.Add(new RGB(red[0], 0, 0));
    colors.Add(new RGB(red[1], 0, 0));
    colors.Add(new RGB(red[2], 0, 0));
    colors.Add(new RGB(red[3], 0, 0));
    colors.Add(new RGB(red[4], 0, 0));

    List<int> green = new List<int> { 0x00, 0x05, 0x06, 0x07, 0x0a };

    colors[0].Green = green[0];
    colors[1].Green = green[1];
    colors[2].Green = green[2];
    colors[3].Green = green[3];
    colors[4].Green = green[4];

    List<int> blue = new List<int> { 0x00, 0x02, 0x03, 0x05, 0x09 };

    colors[0].Blue = blue[0];
    colors[1].Blue = blue[1];
    colors[2].Blue = blue[2];
    colors[3].Blue = blue[3];
    colors[4].Blue = blue[4];
}

You're essentially trying to zip up three collections. If only the LINQ Zip() method supported zipping up more than two simultaneously. But alas, it only supports only two at a time. But we can make it work:

var reds = new List<int> { 0x00, 0x03, 0x06, 0x08, 0x09 };
var greens = new List<int> { 0x00, 0x05, 0x06, 0x07, 0x0a };
var blues = new List<int> { 0x00, 0x02, 0x03, 0x05, 0x09 };

var colors =
    reds.Zip(greens.Zip(blues, Tuple.Create),
        (red, tuple) => new RGB(red, tuple.Item1, tuple.Item2)
    )
    .ToList();

Of course it's not terribly painful to write up an extension method to do three (or more).

public static IEnumerable<TResult> Zip<TFirst, TSecond, TThird, TResult>(
    this IEnumerable<TFirst> first,
    IEnumerable<TSecond> second,
    IEnumerable<TThird> third,
    Func<TFirst, TSecond, TThird, TResult> resultSelector)
{
    using (var enum1 = first.GetEnumerator())
    using (var enum2 = second.GetEnumerator())
    using (var enum3 = third.GetEnumerator())
    {
        while (enum1.MoveNext() && enum2.MoveNext() && enum3.MoveNext())
        {
            yield return resultSelector(
                enum1.Current,
                enum2.Current,
                enum3.Current);
        }
    }
}

This makes things a lot more nicer:

var colors =
    reds.Zip(greens, blues,
        (red, green, blue) => new RGB(red, green, blue)
    )
    .ToList();