2011-09-20 19 views
6

Giả sử quater hiện nay là 3 và năm là năm 2011. Làm thế nào tôi có thể nhận được 5/4 cuối cùngGet cuối quý 'N' trong C#

đầu ra mong muốn:

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

Q và '- 'được nối thêm.

tôi đang cố gắng như dưới

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 
      } 

Cảm ơn

+3

i ++ là đi sai hướng. Vòng lặp của bạn sẽ bắt đầu ở mức 5 và tăng về phía Int32.MaxValue. –

Trả lời

3

Bạn phải giảm biến vòng lặp của bạn. Phần còn lại không phải là quá khó toán. của nó cũng không cần thiết phải xử lý phiên đầu tiên trong bất kỳ cách đặc biệt:

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

của bạn cho vòng lặp nên đi từ 0 đến biến của bạn, khi bạn đang tăng i.

Mã bên trong có thể là một cái gì đó như:

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

Đừng quên để cấu trúc lại nó :)

 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

Một cách là để kiểm tra các cuộn năm qua và sau đó đặt quý 4 và giảm dần năm:

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--; 
    } 
} 

Hoặc bạn có thể tính toán totalQuartal=year+quartal-1. Sau đó giảm nó trên mỗi bước. Và cuối cùng sử dụng year=totalQuartal/4quartal=totalQuartal%4+1. Nhưng tôi nghĩ cách đầu tiên dễ hiểu hơn.

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

Đây là phiên bản của tôi (xin lỗi, nó nằm trong VB.NET).

Ý tưởng là:

  • dễ dàng tìm ra quý dựa vào một ngày (dễ dàng: chia nó bằng 4 ...và thêm 1 để tránh số không)
  • đi ngược thời gian từ ngày hiện tại, loại bỏ 3 tháng tại mỗi lần
  • in quý được định dạng

mã:

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 

Đó cuối cùng "phương pháp thử nghiệm" in ra:

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

Là biểu thức LINQ thuần túy:

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))); 
    } 

Toán học là hơi xấu xí nhưng không làm việc, sử dụng nó, bạn chỉ có thể làm:

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

Trong trường hợp bạn nên làm một số hoạt động trên giai đoạn quý, như kiểm tra nếu khoảnh khắc là trong vòng một quý, bạn có thể sử dụng quý lớp của 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 
Các vấn đề liên quan