C#按对象类型排序对象数组(Icomparable?)

时间:2017-12-22 18:33:45

标签: sorting

我想按对象类型对anarray进行排序。所以所有的歌都在一起,所有的书都在一起,所有的电影都在一起。

我正在读取文件并确定每个对象应该是什么。然后创建对象并将其添加到数组中。

编辑:这是实际的代码。

static Media[] ReadData()
{
 List<Media> things = new List<Media>();
 try
 {
  String filePath = "resources/Data.txt";
  string Line;
  int counter = 0; // used to check if you have reached the max 
  number of allowed objects (100)
  using (StreamReader File = new System.IO.StreamReader(filePath))
  {
   while ((Line = File.ReadLine()) != null)
   {

这是创建每个对象的位置。文件 然后,在行的开头搜索关键字 创建相应的对象。它将分裂 关于对象第一行的信息和意志 读取每一行,直到找到“ - ”字符 将每一行传递到摘要中。然后是摘要 解密后,将创建的对象传递给 数组列表。最后,如果数组列表达到100,那么 将打印“您已达到最大对象数”和 停止阅读文件。

    if (Line.StartsWith("BOOK"))
    {
     String[] tempArray = Line.Split('|'); 
     //foreach (string x in tempArray){Console.WriteLine(x);} //This is used 
for testing 
     Book tempBook = new Book(tempArray[1], 
     int.Parse(tempArray[2]), tempArray[3]);
     while ((Line = File.ReadLine()) != null)
     {
      if (Line.StartsWith("-")){break;}
      tempBook.Summary = tempBook.Summary + Line;
     }
     tempBook.Summary = tempBook.Decrypt();
     things.Add(tempBook);
     counter++;
    }
    else if (Line.StartsWith("SONG"))
    {
     String[] tempArray = Line.Split('|');
     //foreach (string x in tempArray) 
     {Console.WriteLine(x);} //This is used for testing 
     Song tempSong = new Song(tempArray[1], 
     int.Parse(tempArray[2]), tempArray[3], tempArray[4]);
     things.Add(tempSong);
     counter++;
    }
    else if (Line.StartsWith("MOVIE"))
    {
     String[] tempArray = Line.Split('|');
     //foreach (string x in tempArray) 
     {Console.WriteLine(x);} //This is used for testing 
     Movie tempMovie = new Movie(tempArray[1], 
     int.Parse(tempArray[2]), tempArray[3]);
     while ((Line = File.ReadLine()) != null)
     {
      if (Line.StartsWith("-")) { break; }
      tempMovie.Summary = tempMovie.Summary + Line;
     }
     tempMovie.Summary = tempMovie.Decrypt();
     things.Add(tempMovie);
     counter++;
    }
    if (counter == 100)
    {
     Console.WriteLine("You have reached the maximum number of media 
objects.");
     break;
    }
   }
  File.Close();
 }
}
return things.ToArray(); // Convert array list to an Array and return the 
array.
}

在主要代码中,我有这个:

Media[] mediaObjects = new Media[100];
Media[] temp = ReadData();
int input; // holds the input from a user to determin which action to take
for (int i = 0; i<temp.Length;i++){ mediaObjects[i] = temp[i]; }

我希望mediaObjects数组按照什么类型的对象排序。

我还使用了Icomparable来做一个arrayList.sort(),但仍然没有运气。

public int CompareTo(object obj)
    {
        if (obj == null)
        {
            return 1;
        }
        Song temp = obj as Song;
        if (temp != null)
        {
            //Type is a string
            return this.Type.CompareTo(temp.Type);
        }
        else
        {
            return 1;
        }
    }

2 个答案:

答案 0 :(得分:1)

所以我看到你有BOOK,SONG和MOVIE类型。

这是实现IComparable接口的经典案例 - 虽然您对要实现的接口名称是正确的,但您没有正确使用它。

  1. 使用名称MediaObject创建基类 - 这将是您创建的其他类型对象的主要基类。
  2. 添加所需的正确属性。在这种情况下,媒体类型是需要的媒体类型。
  3. 让本课程实现IComparable以帮助您进行比较。
  4. 以PROPER方式覆盖CompareTo()方法
  5. public class MediaObject : IComparable
    {
      private string mediaType;
      public string MediaType
      {
         get  {return mediaType;}
         set {mediaType=value;}
      }
      public MediaObject(string mType)
      {
         MediaType = mType;
      }
      int IComparable.CompareTo(object obj)
      {
         MediaObject mo = (MediaObject)obj;
         return String.Compare(this.MediaType,mo.MediaType); //implement a case insensitive comparison if needed (for your research)
      }
    }
    
    1. 您现在可以直接在主方法中比较MediaObject对象。

答案 1 :(得分:0)

感谢您的建议。我最后只是重新格式化我在阅读时创建列表的方式。我为每个对象创建了多个列表,然后每个对象都发生在主列表中,因此它显示为已排序。我希望在我做这篇长篇文章之前想出来。

据我所知,您无法按通用数组中的对象类型进行排序。如果有人有更好的解决方案,请随时发布。