public class ShortStat
{
private int _cntVisitors;
private string _currentPeriod;
public int CntVisitors
{
get { return _cntVisitors; }
set { _cntVisitors = value; }
}
public string CurrentPeriod
{
get { return _currentPeriod; }
set { _currentPeriod = value; }
}
}
List<ShortStat> stats = new List<ShortStat>();
ShortStat sStat;
sStat = new ShortStat;
sStat.CntVisitors = 123;
sStat.CurrentPeriod = "2006";
stats.Add(sStat);
sStat = new ShortStat;
sStat.CntVisitors = 456;
sStat.CurrentPeriod = "2008";
stats.Add(sStat);
int startYear = 2006;
int endYear = 2008;
for (int i = startYear; i <= endYear; i++)
{
if(!stats.Exists(???)
{
sStat = new ShortStat();
sStat.CurrentPeriod = i.ToString();
sStat.CntVisitors = 0;
stats.Add(sStat);
}
}
Det jag vill är att eftersom 2007 inte finns i listan så vill jag lägga till den!
Kan man använda exists till detta? Och i så fall hur?
Helt OK. En annan variant är att använda ett Dictionary (rent tekniskt kan man även tänka sig en override av Equals och GetHashCode, men det hade vait fel i detta fall)
Dictionary<string,ShortStat> stats = new Dictionary<string,ShortStat>();
ShortStat sStat;
sStat = new ShortStat;
sStat.CntVisitors = 123;
sStat.CurrentPeriod = "2006"; //Varför sträng?
stats.Add(sStat.CurrentPeriod,sStat);
sStat = new ShortStat;
sStat.CntVisitors = 456;
sStat.CurrentPeriod = "2008";
stats.Add(sStat.CurrentPeriod,sStat);
int startYear = 2006;
int endYear = 2008;
for (int i = startYear; i <= endYear; i++)
{
if(!stats.ContainsKey(i.Tostring())
{
sStat = new ShortStat();
sStat.CurrentPeriod = i.ToString();
sStat.CntVisitors = 0;
stats.Add(sStat.CurrentPeriod,sStat);
}
}
För att klassen ShortStat fylls med olika perioder, per år/månad/vecka/dag
Ex. om jag vill se besökare per vecka så ser CurrentPeriod ut: "200714" (för vecka 14 2007)
Det är förvisso bara tal här också så jag skulle kunna använda en int men det känns som om det kvittar!
Och säkert kan man lösa det hela på ett annat snyggare sätt!?
För att klassen ShortStat fylls med olika perioder, per år/månad/vecka/dag
Ex. om jag vill se besökare per vecka så ser CurrentPeriod ut: "200714" (för vecka 14 2007)
Det är förvisso bara tal här också så jag skulle kunna använda en int men det känns som om det kvittar!
Och säkert kan man lösa det hela på ett annat snyggare sätt!?
Brmf, så länge höll det! :e
Fått bygga om lite, detta blir nog bättre! :)
public class ShortStat
{
private int _cntVisitors;
private int _currentYear;
private int _currentMonth;
private int _currentWeek;
private int _currentDay;
public int CntVisitors
{
get { return _cntVisitors; }
set { _cntVisitors = value; }
}
public string CurrentYear
{
get { return _currentYear; }
set { _currentYear = value; }
}
public int CurrentMonth
{
get { return _currentMonth; }
set { _currentMonth = value; }
}
public int CurrentWeek
{
get { return _currentWeek; }
set { _currentWeek = value; }
}
public int CurrentDay
{
get { return _currentDay; }
set { _currentDay = value; }
}
}
Varför inte bara spara undan ett datum och så kan du utifrån det hämta allt det du vill, betydligt enklare och smidigare...
Jag tror inte det går. Eller?!
Om man tar månader tex. så ser SP:n ut så här:
ALTER PROCEDURE [dbo].[Stat_GetMonthUniqueVisitors]
@StartDate datetime = NULL,
@EndDate datetime = NULL
AS
BEGIN
SET NOCOUNT ON;
SELECT SUM(CntVisitors) AS CntVisitors, Period='month', YEAR(CurrentDate) AS CurrentYear,
MONTH(CurrentDate) AS CurrentMonth, CurrentWeek=0, CurrentDay=0
FROM vw_Stat_UniqueVisitors
WHERE CurrentDate BETWEEN COALESCE(@StartDate, CurrentDate) AND COALESCE(@EndDate, CurrentDate)
GROUP BY YEAR(CurrentDate), MONTH(CurrentDate)
ORDER BY YEAR(CurrentDate), MONTH(CurrentDate)
END
Jag grupperar alltså på året samt månad.
Om jag skulle ha ett datum istället, hur grupperar jag då? och vilket datum returnerar jag?
Resultatet ska bli detta om jag skickar in start- och slutdatum från september till december:
september 2007 323
oktober 2007 274
november 2007 445
december 2007 723