2009-11-15 3 views
0

я получил следующий класс:Объединить элементы моего списка

public class Action 
{ 
    public Player player { get; private set; } 
    public string type { get; private set; } 
    public decimal amount { get; private set; } 
} 

Который используется в списке:

public List<Action> Action 

В зависимости от type отобразить некоторый произвольный текст. Но если type = "folds", я просто показываю 1 Folds. Если есть много folds за другим, в настоящее время он показывает:

1 folds, 1 folds, 1 folds, ... 

Как совместить те folds умным способом и показать его, как это:

3 folds, ... 

ответ

1

Просто сделайте счетчик для сгибы, сбросьте его, когда вы нажмете сгиб, увеличьте время до тех пор, пока вы не нажмете не кратно, а затем выведите его перед выполнением текущего действия. Все остальное неэффективно и, честно говоря, переосмысливает проблему.

int counter = 0; 
foreach Action currAction in Action 
{ 
    if (currAction.Type == "fold") 
    { 
     ++counter; 
    } 
    else 
    { 
     if (counter > 0) 
     { 
      \\ print it out and reset to zero 
     } 
     DoStuff(); 
    } 
}   
0
List<Action> actions = … 

Console.WriteLine("{0} folds", actions.Sum(a => a.type == "folds" ? 1 : 0)); 
0

Вы можете использовать LINQ, чтобы сгруппировать элементы по типу, а затем обработать эти группы, чтобы получить желаемый результат:

var actionGroups = actions.GroupBy(a => a.type); 
IEnumerable<string> formattedActions = actionGroups 
    .Select(grp => new[] { Type = grp.Key, Count = grp.Count}) 
    .Select(g => String.Format("{0} {1}{2}", g.Count, g.Type, g.Count == 1 ? "s" : String.Empty)); 
+0

I тоже задавался вопросом, но вам нужно получить счет * последовательных * равных действий. –

0

Вы можете использовать вспомогательный класс, как это:

public class ActionMessages : IEnumerable<string> 
{ 
    private IEnumerable<Action> actions; 

    public IEnumerator<string> GetEnumerator() 
    { 
    int foldCount = 0;  
    foreach(var action in this.actions) { 
     if (action.type=='fold') 
     foldCount++; 
     else { 
     if (foldCount>0) 
      yield return foldCount.ToString() + " folds"; 
     foldCount = 0; 
     yield return action.ToString(); 
     } 
    } 
    if (foldCount>0) 
     yield return foldCount.ToString() + " folds"; 
    } 

    // Constructors 

    public ActionMessages (IEnumerable<Action> actions) 
    { 
    this.actions = actions; 
    } 
} 
Смежные вопросы