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

标签 c# list generics ienumerable

我有一个方法可以返回一个汽车列表(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/

相关文章:

python - 如何使用列表值创建颜色渐变一维热图(带状图)?

Python确保对象出现在列表的末尾

java - 什么时候需要 Some<E extends Some<E>> 而不是 Some<E extends Some>?

c# - 通过 LINQ 从索引迭代中获得 yield

c# - 检测串口电压

c# - 调用任务后丢失 [ThreadStatic] 值

python - 限制 python 中组合/排列的数量

java - 使用泛型通过上下文获取 spring bean

c# - 将多态列表合并为一个列表并获取派生类型

c# - 使用散列进行身份验证