有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

从Java到C#的迭代器方法与接口的等效性,然后在类上实现?

我正在将一个项目从Java转换为C#。在这个Java项目中,有一个接口:public interface TrackIterator,然后它作为其中的一个成员:public Iterator createIterator();。要实现它的类将createIterator作为一个方法,返回对象的Arraylist(在C#列表中),我如何将其从Java转换为C#以便在转换后的C#类上实现它

// interface
public interface TrackIterator
{
    public Iterator createIterator();
}

// class that implements it
public class trackList implements TrackIterator
{
    // other methods, fields, etc

    // method from interface TrackIterator
    public Iterator createIterator()
    {
        // popularSongs is an ArrayList of objects in Java, in C# it's a List<MyTrack>
        return popularSongs.iterator();
    } 
}

共 (1) 个答案

  1. # 1 楼答案

    在我看来,你可以从两个方面着手。第一种方法是使TrackList实现IEnumerable<Track>,并滚动您自己的可枚举项:

    public class Track 
    { 
        public bool IsGoodTrack => true;
    }
    
    public class TrackList : IEnumerable<Track>
    {
        private List<Track> tracks = new List<Track>();
        public IEnumerator<Track> GetEnumerator()
        {
            // Implement custom logic here.
            foreach (var track in tracks)
            {
                if (track.IsGoodTrack())
                  yield return track;
            }
        }
    
        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
    }
    

    或者,如果在公开List<Track>时没有特殊的逻辑,只需在需要的地方使用List<Track>

    public class Foo
    {
      // Foo has a `List<Track>` property:
      public List<Track> Tracks { get; } = new List<Track>();
    }
    

    如果您只想获得一个包含曲目的列表,并将其打印到控制台上,只需执行以下操作:

    var listOfTracks = new List<Track>();
    foreach (var track in listOfTracks)
    {
        Console.WriteLine(track);
    }