Ro'yxatni <T> dan egallagan turga qanday yozish mumkin?

Menda ikkita dars bor:

public class Row : Dictionary {}
public class Table : List {}

Jadval turidagi ob'ektni qaytarishi kerak bo'lgan usulda Where -Statement bilan Jadval turidagi ob'ektni filtrlashga harakat qilaman va buni qaytarib olaman filtrdan keyin ob'ekt.

Table table = new Table();
table = tableObject.Where(x => x.Value.Equals("")).ToList();
return table;

My problem is the cast of the resulting IEnumerable.

  1. (Jadval) bilan ishlash, InvalidCastException

Qo'shimcha ma'lumotlar: 'Jadval' ni yozish uchun 'System.Collections.Generic.List`1 [Row]' turidagi obyektni chiqarib bo'lmadi.

  1. Jadval sifatida bilan ishlash null ob'ekt bilan yakunlanadi

IEnumerable dan Jadval turidagi ob'ektni qanday qaytarishim mumkin?

5
Ya'ni tableObject List <table> emas, balki List emas.
qo'shib qo'ydi muallif Tim Schmelter, manba
List dan meros olish bu erda yaxshi fikr ekanligiga ishonchingiz komilmi? stackoverflow.com/questions/21692193/why-not-inherit -from-li & zg; stt
qo'shib qo'ydi muallif Tim Schmelter, manba
Agar Value bo'lmasa, qismi ishlamaydi.
qo'shib qo'ydi muallif bommelding, manba
Eng kamida bitta qator "Teng" da cheklanadigan qiymatga ega bo'lgan barcha jadvallarni olishni xohlaysizmi?
qo'shib qo'ydi muallif Mighty Badaboom, manba
qo'shib qo'ydi muallif Drag and Drop, manba
Jadvallar ro'yxatini yoki jadvallar ichidagi qatorlar ro'yxatini olishni xohlaysizmi? "tableObject" qanday turdagi?
qo'shib qo'ydi muallif maximelian1986, manba

5 javoblar

Ushbu ishni bajarish uchun kengaytma usulini yaratishingiz mumkin:

static class Extensions
{
    public static Table ToTable(this IEnumerable collection) where T: Row
    {
        Table table = new Table();
        table.AddRange(collection);
        return table;
    }
}

Endi siz bu usulni oddiygina chaqira olasiz:

table = tableObject.Where(x => x.Value.Equals("")).ToTable();

Yoki bo'sh Jadval yaratgandan so'ng, uni to'g'ridan-to'g'ri qilishingiz mumkin:

Table table = new Table();
table.AddRange(tableObject.Where(x => x.Value.Equals("")));
return table;
8
qo'shib qo'ydi
@D.Deder sizni xush ko'radi. Ammo Jadval da boshqa xususiyatlaringiz bormi? chunki bu yechimda ular standart qiymatlarni oladilar!
qo'shib qo'ydi muallif Mong Zhu, manba
Bu juda yaxshi ishladi, rahmat :)
qo'shib qo'ydi muallif D.Weder, manba

Ushbu ishni bajarish uchun kengaytma usulini yaratishingiz mumkin:

static class Extensions
{
    public static Table ToTable(this IEnumerable collection) where T: Row
    {
        Table table = new Table();
        table.AddRange(collection);
        return table;
    }
}

Endi siz bu usulni oddiygina chaqira olasiz:

table = tableObject.Where(x => x.Value.Equals("")).ToTable();

Yoki bo'sh Jadval yaratgandan so'ng, uni to'g'ridan-to'g'ri qilishingiz mumkin:

Table table = new Table();
table.AddRange(tableObject.Where(x => x.Value.Equals("")));
return table;
8
qo'shib qo'ydi
@D.Deder sizni xush ko'radi. Ammo Jadval da boshqa xususiyatlaringiz bormi? chunki bu yechimda ular standart qiymatlarni oladilar!
qo'shib qo'ydi muallif Mong Zhu, manba
Bu juda yaxshi ishladi, rahmat :)
qo'shib qo'ydi muallif D.Weder, manba

I assume your tableObject is a List. Every Table is a List but not every List is a Table, that's why casting doesn't work.

Biror konstruktorni ta'minlash kabi aniq bir yechim bo'lardi:

public class Table : List
{
    public Table(IEnumerable rows) : base(rows) {}
}

table = new Table(tableObject.Where(x => x.Value.Equals("")));
3
qo'shib qo'ydi
Table table = new Table();

buning o'rniga ro'yxat emas, siz shunday qilishingiz kerak:

var tables = new List<table>();
var tableObject = new List<table>{};
tables = tableObject.ToList();
1
qo'shib qo'ydi
Siz ToList() ni ro'yxatga kiritib, uni boshqa ro'yxatga qo'yasiz ... jadvallar = tableObject kabi qisqa bo'lishi mumkin. Lekin men uning savoliga boshqa bir narsani anglatishini o'ylayman.
qo'shib qo'ydi muallif maximelian1986, manba

Siz shunday qilishingiz kerak:

public class Row{
    //whatever you have inside it
    public string MyValue{get;set;}
}

public class Table{
    public List Rows{get;set;}
}

Table table = new Table();
//renaming tableObject to bigListOfRows
table.Rows = bigListOfRows.Where(x => x.MyValue.Equals("")).ToList();
1
qo'shib qo'ydi