如何在不知道类型的情况下实例化泛型列表
本文关键字:情况下 实例化 泛型 列表 类型 不知道 | 更新日期: 2023-09-27 18:09:42
我创建了一个方法来组织一个不知道类型的泛型列表,如果它是整型或十进制,它将排序。
但是从文本框中检索值的代码使用List
我试图将其转换为列表,但它不起作用。我希望这段代码工作,如果他们在文本框中键入整数或小数或字符串。
这是面试问题的一部分,他们要求不要使用排序方法,输入应该接收例如int或DECIMALS
private void btnSort_Click(object sender, EventArgs e)
{
List<int> list = new List<int>();
list.Add(int.Parse(i1.Text));
list.Add(int.Parse(i2.Text));
list.Add(int.Parse(i3.Text));
list.Add(int.Parse(i4.Text));
list.Add(int.Parse(i5.Text));
Sort(list);
StringBuilder sb = new StringBuilder();
foreach (int t in list)
{
sb.Append(t.ToString());
sb.AppendLine();
}
result.Text = sb.ToString();
}
private void Sort<T>(List<T> list)
{
bool madeChanges;
int itemCount = list.Count;
do
{
madeChanges = false;
itemCount--;
for (int i = 0; i < itemCount; i++)
{
int result = Comparer<T>.Default.Compare(list[i], list[i + 1]);
if (result > 0)
{
Swap(list, i, i + 1);
madeChanges = true;
}
}
} while (madeChanges);
}
public List<T> Swap<T>(List<T> list,
int firstIndex,
int secondIndex)
{
T temp = list[firstIndex];
list[firstIndex] = list[secondIndex];
list[secondIndex] = temp;
return list;
}
我想要这样的东西:但是给出错误错误1无法找到类型或命名空间名称"T"(您是否缺少using指令或汇编引用?)c:'users'luis。simbios'documents'visual studio 2010'Projects'InterViewPreparation1'InterViewPreparation1'Generics'GenericsSorting1.cs 22 18 InterViewPreparation1
List List = new List();list.Add (i1.Text);list.Add (i2.Text);排序(列表);
因为这是一个面试问题,他们要求不要使用排序方法。
在这种情况下,您可以添加一个通用约束IComparable<T>
,然后使用CompareTo()
方法:
private void Sort<T>(List<T> list) where T : IComparable<T>
{
//...
}
编辑:你将不得不编写自定义代码来确定输入是字符串,int还是十进制,即使用TryParse(..)
-这将是非常脆弱的,虽然。一旦你知道类型(一种或另一种方式),你可以使用MakeGenericType()
和Activator.CreateInstance()
在运行时创建你的List<T>
对象,然后使用MakeGenericMethod()
调用你的泛型方法:
Type type = typeof(string);
IList list = (IList) Activator.CreateInstance(typeof(List<>).MakeGenericType(type));
//add items to list here
var p = new Program();
MethodInfo method = typeof(Program).GetMethod("Sort");
MethodInfo genericMethod = method.MakeGenericMethod(new Type[] { type });
genericMethod.Invoke(p, new [] {list} );
我很确定这不是面试问题想要问的
首先,正如Jason指出的那样,让平台为您完成工作-调用。sort。
第二,在我看来,你将不得不根据检查文本框的内容来选择List的"T",这样你就可以处理int型和字符串,等等。然后在此基础上给列表分配项目。但是一旦你决定了,你的排序就不会在意了。
你处理这件事的方式不对。正确地拥抱泛型。你想要的是:
public string Foo<T>(IEnumerable<string> strings) where T : struct, IComparable<T> {
var list = strings.Select(s => (T)Convert.ChangeType(s, typeof(T))).ToList();
list.Sort((x, y) => (x.CompareTo(y)));
return String.Join("'n", list);
}
现在你可以说
string response = Foo<int>(strings);
或
string response = Foo<decimal>(strings);
取决于你想要的
注意
- 我们使用
List<T>.Sort
进行排序。 我们使用
String.Join
来构建返回给用户的字符串。这应该可以编译,但如果不能编译,请原谅一些小错误。我现在不能启动旧的编译器。
编辑:我看到你编辑,你不能使用List<T>.Sort
。用你自己的实现代替我使用的List<T>.Sort
是很容易的。
试试这样写:
private static IList foobar(Type t)
{
var listType = typeof(List<>);
var constructedListType = listType.MakeGenericType(t);
var instance = Activator.CreateInstance(constructedListType);
return (IList)instance;
}
然后使用:
IList list = foobar(TYPE);
其中TYPE
是你想要列表的类型
希望这对你有帮助!