【问题标题】:Can I get an element from a List<T> by string-based indexing in .Net? (I.E.: T val = List<T>["NameHere"])我可以通过 .Net 中基于字符串的索引从 List<T> 中获取元素吗? (即:T val = List<T>["NameHere"])
【发布时间】:2014-12-21 20:14:11
【问题描述】:

在 C#/.Net 中,我知道使用 DataSet 您可以通过 DataSet.Tables[NameHere] 访问命名表。

是否可以使用 List 来执行此操作(如果列表中的元素具有可以这样找到它们的属性?)

我不是在说List&lt;T&gt;.Find(tVar =&gt; tVar.Prop == "NameHere")

我只想说T val = List&lt;T&gt;["NameHere"]

这可能吗?如果可以,我将如何实现这一目标?

另外,顺便说一句,我确信它有一个正确的名称:它是什么?

【问题讨论】:

  • 不,你不能,你需要一本字典。将List 视为高级array
  • 好的,然后回到 DataSet.Tables 点,我将如何实现一个可以按名称引用值的通用集合?
  • 这不只是Dictionary&lt;string, T&gt; 还是您想要更多?
  • 为什么你需要一个字典列表是你所寻求的?
  • 我不是在找字典。我有一个带有字符串属性的类,以及另一个保存该类列表的类。我希望能够说 Class1["Class2Name"] 并获得 Class 2 值。无论如何,显然这被称为索引,Eugen 能够为我指出正确的方向。

标签: c# .net string list properties


【解决方案1】:

它被称为“索引器”,更多内容来自here

您可以创建自己的实现 IList 接口的类并向其添加索引器。

【讨论】:

  • 这正是我想要的。谢谢。
【解决方案2】:

为您的类型创建一个KeyedCollection&lt;TKey,TValue&gt;

public class SomeClass
{
    public string Name { get; set; }
    public string Value { get; set; }
}

public class SomeClassCollection : KeyedCollection<string,SomeClass>
{
    protected override string GetKeyForItem(SomeClass item)
    {
        return item.Name;
    }
}

[TestClass]
public class KeyedCollectionTests
{
    [TestMethod]
    public void Test()
    {
        var items = new SomeClassCollection
                    {
                        new SomeClass{Name = "Name 1", Value = "Value 1"},
                        new SomeClass{Name = "Name 2", Value = "Value 2"}
                    };

        items["Name 1"].Value.Should().Be("Value 1");
        items[1].Value.Should().Be("Value 2");
    }
}

【讨论】:

    【解决方案3】:

    @Will 你将自己的代码库添加额外的复杂性,而不会对性能产生任何影响。我认为您的问题可以通过利用 .Net 中的现有功能来解决

    有两种方法可以解决您的问题

    1. 使用 List 指向您的对象集以允许您按 int AND 进行索引 使用字典指向同一组对象以允许您索引我的字符串。一个对象可以被多个集合引用

    2. 使用具有 Int 列和字符串列的 DataTable,在每列上放置一个索引并使用 Find 函数。 (不确定您是否可以像 db 表一样在每列上添加索引,因为我很长时间没有使用 DataTable,但我相信您可以查看 MSDN 文档)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-24
      相关资源
      最近更新 更多