向列表中添加属性?

6
我有一个包含许多对象的列表List<MyObjects> - 我正在遍历这个列表并读取对象。这一切都很好。我刚刚意识到,如果我能向这个列表添加1个特殊值会很棒 - 不是一个对象,只是某个东西的一个值(一个字符串)。
我现在可以创建一个类,例如:
class Needless
{
  public List<MyObjects> MyList { get; set; }
  public string MyValue { get; set; }
}

但我试图避免这种情况。我只需要一个带有输入的字符串,每个List<MyObjects>有任何想法吗?


MyValue 是否独立于 MyList 中的值? - Austin Salonen
在这种情况下,将MyListMyValue添加到Dictionary中,例如Dictionary<string,List<MyObjects>>,是否可行? - Brian Snow
@BrianSnow 我也这么认为。我希望有更简单的方法^^...比如:List.AddProperty(MyValue) - 我的意思是,字典并不是“难”,只是看起来很奇怪。 - miri
列表应该添加一些属性,比如“标签”。 - Lamp
3个回答

8

Tuple<string, List<MyObject>>是一种选择。然而,如果您要经常使用这个组合,我建议创建一个自定义类来更明确地表示它 - 可以像您所做的那样,也可以通过派生List<MyObject>并将字符串添加为属性来实现。

如果您在“范围内”工作,您始终可以创建匿名类型:

var t = new { TheString = "", TheList = new List<MyObject>() };
var list = t.TheList;
var s = t.TheString;

但是,这只在方法的范围内才真正有益处。编译器可以为此提供智能感知,并且它在编译时是强类型的。
或者,如果您真的想尽情发挥,可以使用System.Dynamic中的ExpandoObject:
var expando = new ExpandoObject();
expando.List = new List<MyObject>();
expando.TheString = "";

这是没有 IntelliSense 支持的行内输入,会调用 DLR。 ExpandoObject 在底层简单地使用了一个 IDictionary<string, object>,因此...

var dict = (IDictionary<string, object>)expando;

...是有效的。

最后一个选项有点玩笑味道。它可以工作,但与其他选项相比,对它的开发体验并不理想。话虽如此,我们在测试代码中使用ExpandoObject,但我记不清原因了。希望这样做是有合理原因的,但很可能只是开发人员迷上了新玩具...


3

您可以继承List并简单地添加您的属性,这比在另一个类中组合List要干净一些。


0
你可以使用你的 Needless 类来扩展 List 实现。这样你仍然可以将你的列表视为列表。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接