2012-05-04 4 views
0

Это не зависит от языка, но я буду использовать примеры в C#. Часто мне приходится сталкиваться с проблемой, в которой мне нужно добавить parameter в object внутри любой заданной итерации хотя бы одного из ее параметров, и я всегда должен придумать lame временный list или array какого-либо сопутствующего проблема его правильной корреляции.Переменная, связанная с итерацией?

Так, пожалуйста, медведь со мной на примерах ниже:

  • Есть более простой и лучший способ сделать это в C#?

    List<String> storeStr; 
    
    void AssignStringListWithNewUniqueStr (List<String> aList) { 
        foreach (String str in aList) { 
         storeStr.add(str); 
         str = AProcedureToGenerateNewUniqueStr(); 
        } 
    } 
    
    void PrintStringListWithNewUniqueStr (List<String> aList) { 
        int i = 0; 
        foreach (String str in aList) { 
         print(str + storeStr[i]); 
         i++; 
        } 
    } 
    

Обратите внимание на корреляции выше гарантируются только потому, что я перебор неизмененного aList. Когда вы спрашиваете о «более легком и лучшем способе», я имею в виду, что он также должен быть уверен, что storeStr всегда будет коррелирован с его эквивалентом на aList, сохраняя при этом как можно более коротким и простым. List мог также быть любым видом array или object.


  • Есть ли язык, в котором что-то как это возможно? Он должен давать те же результаты, что и выше.

    IterationBound<String> storeStr; 
    
    void AssignStringListWithNewUniqueStr (List<String> aList) { 
        foreach (String str in aList) { 
         storeStr = str; 
         str = AProcedureToGenerateNewUniqueStr(); 
        } 
    } 
    
    void PrintStringListWithNewUniqueStr (List<String> aList) { 
        foreach (String str in aList) { 
         print(str + storeStr); 
        } 
    } 
    

В этом случае фиктивный «IterationBound» вид гарантировал бы корреляцию между списком и новым параметром (в некотором смысле, так же, как Мусоровозы гарантия ALLOCS). Было бы как-то заметить, что оно было создано внутри итерации и ассоциировано с этим конкретным индексом (независимо от того, будет ли синтаксис более уродливым, конечно). Затем, когда он снова вызван на другой итерации, и он уже был создан или сохранен в этом конкретном индексе, он будет извлекать это конкретное значение этой итерации.

ответ

2

Почему бы просто не проецировать ваш перечислимый в новую форму?

var combination = aList 
     .Select(x => new { Initial = x, Addition = AProcedureToGenerateNewUniqueStr() }) 
     .ToList() 
     .ForEach(x => 
      { 
       print(x.Initial + x.Addition); 
      }); 

Таким образом, вы сохраняете каждый элемент, связанный с новыми данными.

+0

Звучит идеально! – cregox

+0

На самом деле ... Теперь я нашел пару проблем с этим ... Сначала практический: я не мог понять, как объявить «комбинацию» для использования вне области действия метода (как указано в недавно отредактированном вопрос). Что касается проблемы «хорошего настроения»: это кажется излишним: что-то, что может добавить ограничения на его использование. Я еще не тестировал его, но теперь мне интересно, будет ли это работать в моем случае использования: unity3d на ios. – cregox

+0

Если вам нужно получить доступ к нему вне метода, вам нужно будет использовать строго типизированный объект вместо анонимного объекта, например 'Tuple ' и т. Д. Тогда комбинация представляет собой' IEnumerable > ', который вы можете укажите тип возврата. – Tejs

2
aList.ForEach(x => print(x + AProcedureToGeneratorNewUniqueString())); 
+0

Полностью упустил точку - может быть, мне следует переформулировать ... – cregox

+0

Как я пропустил пункт? Выбранный ответ имеет ту же функциональность моего решения. – SimpleVar

+0

@Cawas Ухаживайте за тем, как я пропустил точку? – SimpleVar

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