2015-08-02 3 views
1

Не беспокойтесь, если вы не поняли, что вопрос может быть, я не очень хорошо выражаюсь, поэтому приведу пример. Учитывая два списка:Не следует ли «переменная диапазона» из объединения возвращать список со всеми членами, которые являются одинаковыми?

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 (16, 125) PlayingNote (12, 250)

Большое спасибо.

+0

Что 'PlayingNode' выглядит? Я имею в виду, какое поле имеет dropTime и что такое привод? –

+0

Спасибо Арину за быстрый ответ. PlayingNote выглядит так: \t класс PlayingNote { \t \t общественный исполнительный механизм байта; \t \t public int dropTime; \t \t общественного PlayingNote() { \t \t} \t \t общественного PlayingNote (байт actuatorParam, Int dropTimeParam) { \t \t \t привод = actuatorParam; \t \t \t dropTime = dropTimeParam; \t \t} \t} –

+0

Позвольте мне изменить вопрос, чтобы вы лучше визуализировали –

ответ

0

Добавить 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(); 
+0

Привет, Реза, спасибо, что ответили. 'sameDt' возвращает только один из элементов {223} и {239}. –

0

Вы можете просто написать этот запрос вместо:

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

 Смежные вопросы

  • Нет связанных вопросов^_^