应该'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)
将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();