访问集合中元素的属性以创建新集合

时间:2015-08-17 16:41:34

标签: c# collections

有没有办法将表定义为行集合,并根据行的属性自动填充表中的属性(列)?

例如:

public class Foobar {
    public int TheNumber;
    public string TheString;
}

public class SomeFoobars : List<Foobar> {
    public List<int> TheNumber { 
        get { return Select(foo => foo.TheNumber); }
        set { for (int i = 0; i < Count; i++) { this[i].TheNumber = value[i]; } 
    }
    public List<int> TheString { 
        get { return Select(foo => foo.TheString ); }
        set { for (int i = 0; i < Count; i++) { this[i].TheString = value[i]; } 
    }
}

// So I can now do things like:
SomeFoobars myFoobars = ReturnsListOfFoobar();
MethodThatTakesListOfInt( myFoobars.TheNumbers );
myFoobars.TheString = SomeMethodThatReturnsListOfString();

如果您只需要执行一次,那么创建集合类实现并不是那么糟糕,但我希望为任何类型的行都具有此功能,而不必反复编写集合属性。除了对包含类的特定属性的引用(即上例中的TheNumberTheString)之外,这些属性方法基本相同。

有没有办法实现这个目标?也许用反射?

1 个答案:

答案 0 :(得分:0)

我建议你回去修改你的设计。你现在可能已经意识到,这给你带来了很多麻烦。

如果您仍然决定保留当前套件,可以删除int main() { std::string key = "012#txt1#txt2#txt3#txt4# #some other text:"; std::string temp = key; size_t found = 0; size_t pos_key = temp.find('#'); while((found != 5) && (pos_key != std::string::npos)) { found++; // this line does nothing with the found position // temp.find_first_of('#', pos_key + 1); // instead record the position of the latest '#' pos_key = temp.find_first_of('#', pos_key + 1); // this line just deletes most of the string // for no apparent reason // temp.erase(0, pos_key); } std::cout << " the pos key is " << pos_key << std::endl; } 上的属性,并以这种方式执行相同的操作:

SomeFoobars