webForumDet fria alternativet

söka och lägga till i lista<>

.NET

9 svar · 593 visningar · startad av doggelito

Medlem sedan juni 20003 076 inlägg
Frågan#1

har stött på patrull! :)

har denna kod:

    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?

Medlem sedan jan. 20022 440 inlägg
#2
if(!stats.Contains(???)

kanske löser dina bekymmer?

Medlem sedan juni 20003 076 inlägg
#3

Nej, tyvärr!
Contains vill ha en ShortStat som parameter.
Jag vill på nått vis kolla ett visst värde i en ShortStat.

Medlem sedan juni 20003 076 inlägg
#4

Jag körde ett höftskott och tror fan att jag lyckades! :)

for (int i = startYear; i <= endYear; i++)
                {     
                    if (!stats.Exists(delegate(ShortStat e){ 
                        if(e.CurrentPeriod == i.ToString())
                            return true;
                        else
                            return false;}))
                    {
                        sStat = new ShortStat();
                        sStat.CurrentPeriod = i.ToString();
                        sStat.CntVisitors = 0;
                        stats.Add(sStat);
                    }
                }
Medlem sedan dec. 19996 721 inlägg
#5

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);
        }
}
Medlem sedan juni 20003 076 inlägg
#6

Coolt! Tack för tipset! :)

emission skrev:

//Varför sträng?

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!?

Medlem sedan juni 20003 076 inlägg
#7

doggelito skrev:

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; }
        }
    }
Medlem sedan maj 20012 812 inlägg
#8

doggelito skrev:

Brmf, så länge höll det!
Fått bygga om lite, detta blir nog bättre!

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...

- M

Medlem sedan juni 20003 076 inlägg
#9

Gladh skrev:

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

Medlem sedan maj 20012 812 inlägg
#10

Jag tänkte mer på att byta ut

       private int _currentYear;
        private int _currentMonth;
        private int _currentWeek;
        private int _currentDay;

till ett datum, för du kan ju från detta datum plocka ut allt det du vill, alltså år, dag, månad, vecka...

- M

261 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)
121 ms — ändringar (db)