应该't '从连接返回一个列表,其中所有成员都相同

本文关键字:列表 成员 连接 返回 应该 一个 | 更新日期: 2023-09-27 18:06:00

不要担心,如果你没有理解这个问题,可能是我没有很好地表达,所以我将给出一个例子。给定两个列表:

class PlayingNote {
    public byte actuator;
    public int dropTime;
    public PlayingNote() {
    }
    public PlayingNote(byte actuatorParam, int dropTimeParam) {
        actuator = actuatorParam;
        dropTime = dropTimeParam;
    }
}
List<PlayingNote> activationNotesTmp = new List<PlayingNote>();
activationNotesTmp.Add(new PlayingNote(32, 0));
activationNotesTmp.Add(new PlayingNote(16, 125));
activationNotesTmp.Add(new PlayingNote(12, 250));
activationNotesTmp.Add(new PlayingNote(43, 500));
List<PlayingNote> desactivationNotesTmp = new List<PlayingNote>();
desactivationNotesTmp.Add(new PlayingNote(223, 125));
desactivationNotesTmp.Add(new PlayingNote(239, 250));
desactivationNotesTmp.Add(new PlayingNote(243, 375));
desactivationNotesTmp.Add(new PlayingNote(212, 625));

和查询:

var sameDTNotes =
            (from an in activationNotesTmp
             join dn in desactivationNotesTmp on an.dropTime equals dn.dropTime into sameDt
             from s in sameDt
             select new PlayingNote {
                 dropTime = an.dropTime,
                 actuator = (byte)(an.actuator & s.actuator)
             }).ToList();

查询中的'sameDt'范围变量不应该包含所有成员相同的列表吗?在这个例子中,'sameDt' IEnumerable中的第一个列表应该包含{16,223},第二个列表应该包含{12,239}?我能在下面创建一个选择器比较列表中的成员吗?

public static byte AndBynary<T>(this IEnumerable<T> numbers, Func<T, byte> selector) {
    return (from num in numbers select selector(num)).AndBynary();
}
public static byte AndBynary(this IEnumerable<byte> source) {
    byte retaux = 0xff;
    foreach (byte item in source) {
        retaux &= item;
    }
    return retaux;
}

问题是我如何得到一个包含相同的droptime交集的列表,并使用AndBinary选择器来"合并"执行器?

包含两个PlayingNotes的最终列表:PlayingNote (125)PlayingNote (250)

应该't '从连接返回一个列表,其中所有成员都相同

将GroupBy添加到查询中,然后选择如下对象:

var sameDTNotes =
    (from an in activationNotesTmp
        join dn in desactivationNotesTmp on an.DropTimeParam equals dn.DropTimeParam
        select new { an.DropTimeParam, ActuatorParams = new[] { an.ActuatorParam, dn.ActuatorParam } });
var result=sameDTNotes.GroupBy(p => p.DropTimeParam, p => p.ActuatorParams)
.Select(p => new PlayingNote
{
    DropTimeParam = p.Key,
    ActuatorParam = AndBynary(p.SelectMany(q => q))
}).ToList();

您可以简单地编写以下查询:

var result = (from an in activationNotesTmp
              join dn in desactivationNotesTmp on an.dropTime equals dn.dropTime
              select new[] { an.actuator, dn.actuator }.AndBynary()
             ).ToList();