2011-09-20 4 views
6

Supongamos que el quater actual es 3 y el año es 2011. ¿Cómo puedo obtener los últimos 5 trimestresRecuperación de la última 'N' cuartos en C#

salida deseada:

Q3-2011 
Q2-2011 
Q1-2011 
Q4-2010 
Q3-2010 

La Q y '- 'se adjunta.

Estoy tratando tan bajo

int generateQuater = 5; 

      int currentQuater = 3;//GetQuarter(DateTime.Now.Month); 
      int currentYear = DateTime.Now.Year; 

      List<string> lstQuaterYear = new List<string>(); 

      lstQuaterYear.Add(string.Concat('Q',currentQuater, '-', currentYear)); 

      for (int i = generateQuater; i > 0; i++) 
      { 
       //code to be placed 
      } 

Gracias

+3

i ++ está yendo en la dirección equivocada. Su ciclo comenzará en 5 y aumentará hacia Int32.MaxValue. –

Respuesta

3

Tienes que disminución la variable de bucle. El resto no es una matemática muy difícil. Su tampoco es necesario para manejar la primera iteración de un modo especial:

for (int i = generateQuater; i > 0; i--) 
{ 
    lstQuaterYear.Add(string.Format("Q{0}-{1}", currentQuater, currentYear)); 
    if (--currentQuater == 0) 
    { 
     currentQuater = 4; 
     currentYear--; 
    } 
} 
0

Su bucle debe ir de 0 a la variable, cuando estás aumentando i.

El código interno podría ser algo como:

currentQuarter--; 
if(currentQuarter == 0) 
{ 
    currentQuarter = 4; 
    currentYear--; 
} 
0

No se olvide de refactorearlo :)

 int count = 5; 

     int currentQuarter = GetQuarter(DateTime.Now.Month); 
     int currentYear = DateTime.Now.Year; 

     List<string> lstQuaterYear = new List<string>(); 

     for (int i = count; i > 0; i--) 
     { 
      lstQuaterYear.Add(string.Concat('Q', currentQuarter, '-', currentYear)); 
      currentQuarter--; 
      if (currentQuarter == 0) 
      { 
       currentQuarter = 4; 
       currentYear--; 
      } 
     } 
0

Una forma es para comprobar si hay rollo año durante y después establecer el trimestre a 4 y disminuir el año:

int quarter=3; 
int year=2011; 
int count=5; 
for(int i=0;i<count;i++) 
{ 
    lstQuaterYear.Add(string.Format("Q{0} {1}", quarter, year); 
    quarter--; 
    if(quarter==0) 
    { 
    quarter=4; 
    year--; 
    } 
} 

alternativa usted puede calcular una totalQuartal=year+quartal-1. Luego disminuya en cada paso. Y finalmente use year=totalQuartal/4 y quartal=totalQuartal%4+1. Pero creo que la primera forma es más fácil de entender.

0
public static IEnumerable Generate(int number, int currentYear, int currentQuarter) 
{ 
    int counter = number; 
    int quarter = currentQuarter; 
    int year = currentYear; 
    while (counter-- > 0) 
    { 
     yield return String.Format("Q{0}-{1}", year, quarter); 
     quarter = quarter>1?quarter-1:4; 
     year = quarter==4?year-1:year; 
    } 
} 
0

Aquí está mi versión (lo siento, está en VB.NET).

La idea es:

  • encontrar fácilmente el trimestre en base a una fecha (Fácil: se divide por 4 ...y añadir 1 para evitar ceros)
  • a retroceder en el tiempo a partir de la fecha actual, la eliminación de 3 meses en cada momento
  • copia impresa del trimestre formato

el código:

Private Shared Function GetQuarterForDate(ByVal d As DateTime) As Integer 
    Return (d.Month \ 4) + 1 'integer division 
End Function 

Private Shared Function GetLastNQuarters(ByVal N As Integer) As IEnumerable(Of String) 
    Dim myDate = DateTime.Now 
    Dim res As New List(Of String)() 
    Do While N > 0 
     'using yield would be nicer in C# ... does not exist in VB 
     res.Add(String.Format("Q{0}-{1}", GetQuarterForDate(myDate), myDate.Year)) 
     myDate = myDate.AddMonths(-3) 
     N = N - 1 
    Loop 
    Return res 
End Function 

<TestMethod()> 
Public Sub CanRetrieveQuarter() 
    Dim quarters = GetLastNQuarters(5) 

    For Each q In quarters 
     Console.WriteLine(q) 
    Next 
End Sub 

Esa última "método de prueba" imprime:

Q3-2011 
Q2-2011 
Q1-2011 
Q4-2010 
Q3-2010 
1

Como una expresión LINQ pura:

public IEnumerable<String> GetQuarters(int start, int year, int count) 
    { 
     return (from q in Enumerable.Range(0, count) 
       select String.Format("Q{0}-{1}", (start - q) + (((q + 1)/4) * 4) , year - ((q + 1)/4))); 
    } 

La matemática es un poco feo, pero no trabajo, para usarlo sólo se puede hacer:

foreach (String quarter in GetQuarters(3, 2011, 5)) 
{ 
    Console.WriteLine(quarter); 
} 
0

En caso de que usted debe hacer algunas operaciones en el cuarto período, como verificación si actualmente se encuentra dentro de una trimestre, se puede utilizar el barrio clase del Time Period Library for .NET:

// ---------------------------------------------------------------------- 
public ITimePeriodCollection GetPastQuarters(int count) 
{ 
    TimePeriodCollection quarters = new TimePeriodCollection(); 

    Quarter quarter = new Quarter(); 
    for (int i = 0; i < count; i++) 
    { 
    quarters.Add(quarter); 
    quarter = quarter.GetPreviousQuarter(); 
    } 

    return quarters; 
} // GetPastQuarters 
Cuestiones relacionadas