簡體   English   中英

如何在不知道類型的情況下實例化通用列表

[英]How to instantiate a generic list without knowing the type

我創建了一個方法來組織通用列表,但不知道類型,它將按int或十進制排序。

但是,從文本框中檢索值的代碼使用列表

我試圖將其轉換為列表,但它不起作用。 如果他們在文本框中鍵入整數或小數或字符串,則我希望此代碼能夠工作。

這是面試問題的一部分,他們要求不要使用排序方法,並且輸入內容應為INTS或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.Add(i1.Text); list.Add(i2.Text); 排序(列表);

因為這是他們要求不要使用排序方法的面試問題。

在這種情況下,您可以添加通用約束IComparable<T> ,然后使用CompareTo()方法:

 private void Sort<T>(List<T> list) where T : IComparable<T>
 {
    //...
 }

編輯:

您將必須編寫自定義代碼來確定輸入是字符串,整數還是十進制,即使用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。

其次,在我看來,您將需要根據檢查文本框的內容來選擇列表的“ T”,以便可以處理整數或字符串等。然后根據以下內容將項目分配給列表那。 但是一旦您決定了,您的排序就不會在意了。

您沒有以正確的方式進行操作。 正確擁抱泛型。 您想要的是:

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);

取決於您想要的。

注意

  1. 我們使用List<T>.Sort進行排序。
  2. 我們使用String.Join構建字符串以顯示給用戶。

這應該可以編譯,但是如果沒有,請原諒小錯誤。 我現在無法啟動ol'編譯器。

編輯:我看到您進行了編輯,因為您不能使用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是您要列出的類型。

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM