Autor Beitrag
alaudo
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mi 29.10.08 15:22 
Hallo,

ich habe ein ListView und möchte für einen bestimmten Ablauf auf Items über LINQ zugreifen können. Leider implementiert ListViewItemCollection kein IEnumerable, dafür gibt es aber die Methode CopyTo, womit man den ganzen Inhalt zu einem Array umwandeln kann.
Ich würde aber sehr gerne zu einem typisierten Array umwandeln, also nicht zu object[], sondern zu ZeilenInhalt[]. Wie kann ich dann bei CopyTo das ganze Array auf einmal zu einem anderen Typ casten? Wie kann man in C# explizietes Casten implementieren (damit ich selber bestimmen kann, welche SubItems auf welche Felder von meiner Klasse gemappt werden)?

Vielen Dank im Voraus,
Alexander.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 29.10.08 15:29 
Hi und :welcome:!

Es gibt doch die Cast<T>-Extension-Methode. Die wird mir im IntelliSense auch für eine ListViewItemCollection angezeigt. Die gibt Dir eine IEnumerable<T>, womit Du dann eigentlich alles anstellen kannst, was Du willst ;-)

Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
alaudo Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Di 11.11.08 13:26 
Hallo, Christian,

danke für Deine schnelle Antwort -- ich versuchte inzwischen selber die Lösung zu finden, jedoch ohne Erfolg.
Auf MSDN-Seite steht, dass ListViewItemCollection folgende Erweiterungsmetoden unterstützt:

AsQueryable Konvertiert ein IEnumerable in ein IQueryable. (Durch Queryable definiert.)
Cast Konvertiert die Elemente eines IEnumerable in den angegebenen Typ. (Durch Enumerable definiert.)
OfType Filtert die Elemente eines IEnumerable anhand eines angegebenen Typs. (Durch Enumerable definiert.)

Wenn ich aber es versuche, eine der Metoden aufzurufen, dann bekomme ich diese in IntelliSense nicht angezeigt.

Was mir aber noch aufgefallen hat ist folgendes: alle 3 Erweiterungsmetoden erweitern die IEnumerable, die ListViewItemCollection implementiert aber diese Schnittstelle nicht, sondern die ICollection. Daher kann man, z.B., da kein LINQ direkt anwenden.

Aber das kann ich kaum glauben...

Im Moment mache ich folgende Umwandlung, die vielleicht nicht besonders schön ist:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
    [Serializable]
    public class LinkInfo
    {
        public string FileName { get; set; }
        public string LinkContent { get; set; }
        public string LinkStatus { get; set; }
        public string NewLink { get; set; }
    }

        public static IEnumerable<LinkInfo> GetLinksFromListView(ListView lstLinkList)
        {
            
            foreach (ListViewItem li in lstLinkList.Items)
            {
                LinkInfo newLink = new LinkInfo();
                newLink.FileName = new string(li.Text.ToCharArray());
                newLink.LinkContent = new string(li.SubItems[1].Text.ToCharArray());
                newLink.LinkStatus = new string(li.SubItems[2].Text.ToCharArray());
                newLink.NewLink = new string(li.SubItems[3].Text.ToCharArray());
                yield return newLink;
            }

        }
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 11.11.08 17:04 
user profile iconalaudo hat folgendes geschrieben Zum zitierten Posting springen:
alle 3 Erweiterungsmetoden erweitern die IEnumerable, die ListViewItemCollection implementiert aber diese Schnittstelle nicht, sondern die ICollection. Daher kann man, z.B., da kein LINQ direkt anwenden.
MSDN und Christian werden dich hoffentlich nicht gleichzeitig belügen :D . Schau dir mal an, von welchem Interface ICollection erbt ;) ...


user profile iconalaudo hat folgendes geschrieben Zum zitierten Posting springen:
Wenn ich aber es versuche, eine der Metoden aufzurufen, dann bekomme ich diese in IntelliSense nicht angezeigt.
Dann hast du wahrscheinlich den System.Linq-Namespace (enthält Enumerable) nicht eingebunden. Ansonsten: Welche Fehlermeldung kommt, wenn du einfach mal ohne IntelliSense weiterschreibst?

Zitat:

ausblenden C#-Quelltext
1:
               newLink.FileName = new string(li.Text.ToCharArray());					

Huh, was hast du denn damit vor? Wenn du eine Kopie anlegen willst, um nachher nicht aus Versehen den String in der ListView zu überschreiben: Keine Angst, System.String ist sowieso immutable.

_________________
>λ=