簡體   English   中英

如何在C#中為通用功能合並列表?

[英]How to combine lists for universal function in C#?

我希望這個問題不要太混亂,我一直在嘗試將大量不同類型的列表合並到一個函數中,而無需編寫大量代碼,但我不知道該怎么做。 這是方案:

我有一些類似的類(TClass1.cs,TClass2.cs,TClass3.cs,TClass4.cs等):

namespace Polly
{
    public class TClass1
    {
        public string Box1 { get; set; }
        public string Box2 { get; set; }
    }
}

然后,我將它們用作列表:

    public List<TClass1> List1 = new List<TClass1>(); 
    public List<TClass2> List2 = new List<TClass2>(); 
    public List<TClass3> List3 = new List<TClass3>(); 

目前,我在Main.cs中使用它們的方式如下:

public class Polly
{
    private void button1_Click(object sender, EventArgs e)
    {
        if (value == 1)
        {
            //100 rows calculating string f
            string f = List1.Box1;
        }
        else if (value == 2)
        {
            //100 rows calculating string f
            string f = List2.Box1;
        }
        else if (value == 3)
        {
            //100 rows calculating string f
            string f = List3.Box1;
        }
    }
}

由於所有列表基本相同,並且復制並粘貼,因此我只想像這樣計算一次字符串f:

public class Polly
{
    private void button1_Click(object sender, EventArgs e)
    {
        if (value == 1)
        {
            GetString(List1);
        }
        else if (value == 2)
        {
            GetString(List2);
        }
        else if (value == 3)
        {
            GetString(List3);
        }
    }

    private string GetString(List<> ls)
    {
         //100 rows calculating string f
         string f = ls.Box1;
         return f;
    }
}

唯一的問題是,我應該使用哪種類型的列表,因為它會在列表之間變化(TClass1,TClass2等)?

 private string GetString(List<WHATDOIPUTINHERE?> ls){}

每個類都應從接口繼承

interface IBox1
{
    string Box1 { get; set; }
}

然后您的課程將實現它:

public class TClass1 : IBox1
{
    public string Box1 { get; set; }
    public string Box2 { get; set; }

}

然后,您的列表可以是派生類型:

List<TClass1> List1 = new List<TClass1>();

您可以向其中添加TClass1對象:

List1.Add(new TClass1());

還有您的方法定義,應該對其進行擴展。

 private string GetString(List<Box1Interface> ls) {
        return "";
    }

和你的方法調用。 這包括在調用之前對接口的強制轉換。

GetString(List1.ConvertAll(x => (IBox1)x));

假設所有這些類都具有Box1Box2屬性,則可以從基類中派生所有這些類。

public abstract class BaseClass
{
    public string Box1 { get; set; }
    public string Box2 { get; set; }
}

public class Class1 : BaseClass
{
    public int AdditionalProp { get; set; }
}

public class Class2 : BaseClass
{
    public double YetAnotherlProp { get; set; }
}

public class Class3 : BaseClass
{ }

public class Class4 : BaseClass
{ }

然后創建一個列表數組,類型為IEnumerable<BaseClass>[] (此處帶有示例數據):

public IEnumerable<BaseClass>[] _enumLists = new IEnumerable<BaseClass>[] {
    new List<Class1>{ new Class1 { Box1 = "a1" }, new Class1 { Box1 = "a2" }, new Class1 { Box1 = "a3" } },
    new List<Class2>{ new Class2 { Box1 = "b1" }, new Class2 { Box1 = "b2" }, new Class2 { Box1 = "b3" } },
    new List<Class3>{ new Class3 { Box1 = "c1" }, new Class3 { Box1 = "c2" }, new Class3 { Box1 = "c3" } },
    new List<Class4>{ new Class4 { Box1 = "d1" }, new Class4 { Box1 = "d2" }, new Class4 { Box1 = "d3" } },
};

由於接口被聲明為

public interface IEnumerable<out T> : IEnumerable

...它是協變的,可讓您組合列表以進行只讀訪問和枚舉。

然后,您可以輕松獲取組合字符串

private string GetString(int value)
{
    return String.Join(", ", _enumLists[value - 1].Select(item => item.Box1));
}

測試:

Console.WriteLine(GetString(2)); // Prints: c1, c2, c3

暫無
暫無

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

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