gpt4 book ai didi

C# Return Generic List/IEnumerable,它是如何工作的?

转载 作者:太空宇宙 更新时间:2023-11-03 21:54:57 25 4
gpt4 key购买 nike

我有一个方法可以返回一个汽车列表(IEnumerable)..

(适用于返回类型 IEnumerable<Car>List<Car> ):

public IEnumerable<Car> GetCars(string xml)
{
var myResultList;

XElement doc = XElement.Parse(xml);
myResultList = doc.Descendants().Descendants("dict").Select(
x => new Employee
{
Id = x.Elements("string").ElementAt(0).Value,
Prename = x.Elements("string").ElementAt(1).Value,
Name = x.Elements("string").ElementAt(2).Value,
Initials = x.Elements("string").ElementAt(3).Value
}
);

IEnumerable<Car> enumerable = myResultList;
return enumerable;

//---

//or as a List if it's better?
List<Car> asList = enumerable.ToList();
//then: return asList
}

现在我想让这个方法通用。每个 IEnumerable 类型/或列表类型都应该能够。

类似这样的东西 - 那只是伪代码,因为我不知道它是如何工作的;

public IEnumerable<T> GetData(string xml)
{
var myResultList;

//...myResultList.. will be filled here (unnecessary)

IEnumerable<T> enumerable = myResultList;
return enumerable;

//---

//or as a List if it's better?
List<T> asList = enumerable.ToList();
//then: return asList
}

我希望我的问题够清楚了.. 想象一下你会有一个像 House 而不是 Car 的其他类型,但你想对每种类型使用相同的方法.

我怎样才能做到这一点?帮助将不胜感激。

编辑:

添加了填充“myResultsList”的代码

编辑 2:2 个 XML 应该使用相同的方法:

 <plist version="1.0">
<dict>
<key>DataType</key>
<string>Employee</string>
<key>8000</key>
<dict>
<key>MitarbeiterNo</key>
<string>8000</string>
<key>Vorname</key>
<string>Walter</string>
<key>Name</key>
<string>Walter Lohner Stans</string>
<key>Initialien</key>
<string>MAL</string>
</dict>
<key>8001</key>
<dict>
<key>MitarbeiterNo</key>
<string>8001</string>
<key>Vorname</key>
<string>Motorrad</string>
<key>Name</key>
<string> Meierskappel</string>
<key>Initialien</key>
<string>MAM</string>
</dict>
<key>8004</key>
<dict>
<key>MitarbeiterNo</key>
<string>8004</string>
<key>Vorname</key>
<string>Hanspeter</string>
<key>Name</key>
<string>Altenbürger AG Horgen</string>
<key>Initialien</key>
<string>FH</string>
</dict>
</dict>
</plist>

 <plist version="1.0">
<dict>
<key>DataType</key>
<string>Agent</string>
<key>7000</key>
<dict>
<key>AgentNo</key>
<string>7000</string>
<key>Initialien</key>
<string>VW</string>
<key>Namen</key>
<string>Walter Gnos Vertretungen Vevey</string>
</dict>
<key>7001</key>
<dict>
<key>AgentNo</key>
<string>7001</string>
<key>Namen</key>
<string>Miller GmbH Bern</string>
</dict>
<key>7002</key>
<dict>
<key>AgentNo</key>
<string>7002</string>
<key>Initialien</key>
<string>MAL</string>
<key>Namen</key>
<string>Walter Lohner Stans</string>
</dict>
</dict>
</plist>

最佳答案

您唯一缺少的是 <T> :

public IEnumerable<T> GetData<T>(string xml)

然后你称它为:

var data = obj.GetData<House>(xml);

哪里<House>告诉GetData什么T是为了那个电话。注意里面GetData<T>你可以使用 typeof(T)得到Type ,如果您使用 XmlSerializer,这可能是必需的或类似的反序列化。

请注意,在某些情况下,使用泛型真的很方便,而在其他一些情况下,它实际上会使事情变得有问题 - 所以您可能想考虑是否它可能不适合使用:

public IEnumerable GetData(Type type, string xml)

即通过 Type in 作为常规参数。如果你正在做大量的反射工作,这会很有用,泛型变得很棘手。但要强调:通用和非通用的解决方案都是合理有效的。

关于C# Return Generic List/IEnumerable,它是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12688816/

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