[C#] IEnumerable empty returnen

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Kayshin
  • Registratie: Juni 2004
  • Laatst online: 09-03-2018

Kayshin

Bl@@T @@P!!!

Topicstarter
Hallo,

Ik ben bezig met een applicatie voor school waar ik het volgende voor elkaar wil krijgen:

Ik ben aan het zoeken in een XML op de volgende manier:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        public bool getDataByPatientName(string name, string exNaam)
        {
            IEnumerable<XElement> ie = from el in xe.Elements()
                                       where (string)el.Element("name") == name
                                       && (string)el.Attribute("name") == exNaam
                                       select el;
            lp.Clear();
            foreach (XElement el in ie)
            {
                exName = (string)el.Attribute("name");
                lp.Add((double)el.Element("score"));
                timestamps.Add(DateTime.Parse((string)el.Element("timestamp")));
            }
            return true;
        }


Het probleem is nu dat ik hier doorheen loop met verschillende waarden voor exNaam en dat ik erachter wil komen of de resultset van ie leeg is of niet, echter gaat dit niet voordat ik door de elementen heen aan het gaan ben (http://www.atrevido.net/b...b7-90b0-4207bf2cdb54.aspx). Is er hier een manier voor te vinden? De klasse die op de gelinkte website staat werkt niet naar behoren en ik kom er niet achter wat het probleem ermee is.

Het volgende zou dus de bedoeling moeten zijn (pseudo):
code:
1
2
3
4
5
            IEnumerable<XElement> ie = from el in xe.Elements()
                                       where (string)el.Element("name") == name
                                       && (string)el.Attribute("name") == exNaam
                                       select el;
if(ie z'n resultset is leeg) return false

My personal videoteek: -Clique-; -NMe- is een snol!


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Een IEnumerable heeft de mogenlijkheid om een enumerator op te vragen, en daar zul je dus moeten kijken of je minstens een stap kunt doen. Een enumerator heeft immers geen Count of HasElements property
C#:
1
2
3
4
if(!ie.GetEnumerator().MoveNext())
{
    return false;
}

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Phyxion
  • Registratie: April 2004
  • Niet online

Phyxion

_/-\o_

Kayshin schreef op woensdag 27 mei 2009 @ 13:50:
Hallo,

Ik ben bezig met een applicatie voor school waar ik het volgende voor elkaar wil krijgen:

Ik ben aan het zoeken in een XML op de volgende manier:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        public bool getDataByPatientName(string name, string exNaam)
        {
            IEnumerable<XElement> ie = from el in xe.Elements()
                                       where (string)el.Element("name") == name
                                       && (string)el.Attribute("name") == exNaam
                                       select el;
            lp.Clear();
            foreach (XElement el in ie)
            {
                exName = (string)el.Attribute("name");
                lp.Add((double)el.Element("score"));
                timestamps.Add(DateTime.Parse((string)el.Element("timestamp")));
            }
            return true;
        }


Het probleem is nu dat ik hier doorheen loop met verschillende waarden voor exNaam en dat ik erachter wil komen of de resultset van ie leeg is of niet, echter gaat dit niet voordat ik door de elementen heen aan het gaan ben (http://www.atrevido.net/b...b7-90b0-4207bf2cdb54.aspx). Is er hier een manier voor te vinden? De klasse die op de gelinkte website staat werkt niet naar behoren en ik kom er niet achter wat het probleem ermee is.

Het volgende zou dus de bedoeling moeten zijn (pseudo):
code:
1
2
3
4
5
            IEnumerable<XElement> ie = from el in xe.Elements()
                                       where (string)el.Element("name") == name
                                       && (string)el.Attribute("name") == exNaam
                                       select el;
if(ie z'n resultset is leeg) return false
Volgens Google moet er gewoon een .Count zijn => if (ie.Count == 0) return false.

@Hierboven:
Count Overloaded. Returns the number of elements in a sequence.

Moet er wel inzitten volgens MSDN.

'You like a gay cowboy and you look like a gay terrorist.' - James May


Acties:
  • 0 Henk 'm!

  • Kayshin
  • Registratie: Juni 2004
  • Laatst online: 09-03-2018

Kayshin

Bl@@T @@P!!!

Topicstarter
Werkt perfect (allebei de oplossingen) :) Is voor mij de eerste keer werken met een IEnumerable maar begin t nu door te krijgen :)

Ik ben bezig geweest met empty() en ook een count geprobeerd maar ik denk dat mijn code een troep was waardoor ie em niet kon vinden... Bedankt!

[ Voor 45% gewijzigd door Kayshin op 27-05-2009 14:00 ]

My personal videoteek: -Clique-; -NMe- is een snol!


Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

.Count is property van onder andere IList, .Count() is een Linq extensie methode op IEnumerable.

Woy's oplossing is netter als je alleen wilt weten of je collectie items bevat (wel of niet leeg). Een Count() zal altijd alle elementen moeten doorlopen, terwijl dat bij een MoveNext niet nodig is en dus een (iets) betere performance zal geven.

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Phyxion schreef op woensdag 27 mei 2009 @ 13:58:
[...]
Volgens Google moet er gewoon een .Count zijn => if (ie.Count == 0) return false.

@Hierboven:
Count Overloaded. Returns the number of elements in a sequence.

Moet er wel inzitten volgens MSDN.
Ja er is inderdaad een extension method Count, die is echter op de volgende manier geimplementeerd
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public static int Count<TSource>(this IEnumerable<TSource> source)
{
    if (source == null)
    {
        throw Error.ArgumentNull("source");
    }
    ICollection<TSource> is2 = source as ICollection<TSource>;
    if (is2 != null)
    {
        return is2.Count;
    }
    int num = 0;
    using (IEnumerator<TSource> enumerator = source.GetEnumerator())
    {
        while (enumerator.MoveNext())
        {
            num++;
        }
    }
    return num;
}

Als de IEnumerable dus geen ICollection is dan itereert hij dus gewoon over alle elementen, dan is het IMHO netter om gewoon te kijken of je minstens 1 iteratie kunt maken.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1