gpt4 book ai didi

c# - 是否有一个通用集合,我可以通过索引器按字符串键和索引访问元素?

转载 作者:行者123 更新时间:2023-12-02 22:32:25 45 4
gpt4 key购买 nike

我想声明一个通用的对象集合,并能够通过索引器通过键字符串值或索引访问它们。我该怎么做呢?是否有不需要子类化的开箱即用的 .Net 类?

class Program
{

static void Main(string[] args)
{

System.Collections.Generic.WhatKindOfCollection<PageTab> myPageTabs
= new System.Collections.Generic.WhatKindOfCollection<PageTab>();

PageTab pageTab1 = new PageTab();
pageTab1.ID = "tab1";
myPageTabs.Add(pageTab1);

myPageTabs.Add(new PageTab("tab2"));

myPageTabs[0].label = "First Tab";
myPageTabs["tab2"].label = "Second Tab";

}

public class PageTab
{
public PageTab(string id)
{
this.ID = id;
}

public PageTab() { }


//Can I define ID to get the key property by default?
public string ID { get; set; }

public string label { get; set; }
public bool visible { get; set; }
}
}

最佳答案

看起来您正在寻找源自 System.Collections.ObjectModel.KeyedCollections 的内容.

我认为 .NET 框架中不存在您要查找的特定类,因此您可能必须自己对其进行子类化。

KeyedCollection 是对象的基类,其中键是对象的一部分。这意味着当您使用整数索引访问它时,您将取回原始对象而不是 KeyValueCollection。

我已经有一段时间没用过了,但我不记得它有多难。

编辑:您的另一个代码选项。这比我记得的要容易:

public class MyKeyedCollection<TKey, TItem> : KeyedCollection<TKey, TItem>
{
public MyKeyedCollection(Func<TItem, TKey> keyFunction)
{
_keyFunction = keyFunction;
}

private Func<TItem, TKey> _keyFunction;

protected override TKey GetKeyForItem(TItem item)
{
return _keyFunction(item);
}
}

使用:

var myPageTabs = new MyKeyedCollection<String, PageTab>(i => i.ID);

或 LINQ 之前:

public class MyKeyedCollection<TKey, TItem> : KeyedCollection<TKey, TItem>
{
public MyKeyedCollection(String keyProperty)
{
_keyProperty = keyProperty;
}

private String _keyProperty;

protected override TKey GetKeyForItem(TItem item)
{
return (TKey)item.GetType().GetProperty(_keyProperty).GetValue(item, null);
}
}

MyKeyedCollection<String, PageTab> myPageTabs = new MyKeyedCollection<String, PageTab>("ID");

关于c# - 是否有一个通用集合,我可以通过索引器按字符串键和索引访问元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11998560/

45 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com