![](/img/trans.png)
[英]How to combine two lists with different properties based on a condition in 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));
假設所有這些類都具有Box1
和Box2
屬性,則可以從基類中派生所有這些類。
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.