c# - 从 List<KeyValuePair<string,string>> 返回匹配项

标签 c# list foreach

我目前有一个使用 KeyValuePair 的类与 List以 Key = track, Value = artist 的格式存储轨道集合。

我试图提供一种搜索特定轨道的方法,如果有任何匹配项,则返回整个匹配的 CD。

这是我目前的尝试:

public CompilationCD FindTrackInComCD(string track)
{
    CompilationCD temp = new CompilationCD();

    List<CD> tempComCols = _cdCollection.FindAll(delegate(CD cd)
    { return cd.GetType() == temp.GetType(); });

    foreach (KeyValuePair<string, string> comCD in tempComCols)
    {
        if (comCD.Key.Contains(track))
        {
            return comCD;
        }
    }

    throw new ArgumentException("No matches found");
}

我有一个 CD 类型的集合 ( List<CD> ) 因此我创建了一个新的 List<>通过将其与临时列表进行比较来选择合适的类型。

编译时出现以下错误:

Cannot convert type 'CDCollection.CD' to System.Collections.Generic.KeyValuePair<string,string>'

Cannot implicitly convert type 'System.Collections.Generic.KeyValuePair<string,string>'

(CDCollection 是我的项目命名空间,CD/CompilationCD 是类)

抱歉,这个问题似乎与我之前问过的问题类似。我尝试使用之前提供的方法,但我有点难过;我没用过List<>KeyValuePair非常频繁。

这是 CD 类:

using System;

使用系统集合; 使用 System.Collections.Generic; 使用 System.Linq; 使用系统文本;

命名空间 CDCollection { 公开课CD { #region 字段 私有(private)只读字符串_artist; 私有(private)只读字符串_album; 私有(private)列表_track = 新列表(); #endregion

    #region Constructors
    public CD()
    {
        _artist = "";
        _album = "";
        _track = null;
    }

    public CD(string albumName)
    {
        _album = albumName;
    }

    public CD(string artistName, string albumName)
    {
        _artist = artistName;
        _album = albumName;
    }

    #endregion

    #region Properties
    /// <summary>
    /// Get/Set Artist Name
    /// </summary>
    public virtual string Artist
    {
        get
        {
            return _artist;
        }
        set
        {
            value = _artist;
        }
    }

    /// <summary>
    /// Get/Set Album
    /// </summary>
    public string Album
    {
        get
        {
            return _album;
        }
        set
        {
            value = _album;
        }
    }

    /// <summary>
    /// Get/Set Track Name
    /// </summary>
    public virtual List<string> Track
    {
        get
        {
            return _track;
        }
        set
        {
            value = _track;
        }
    }

    #endregion

    #region ToString()
    /// <summary>
    /// Custom ToString() Method
    /// </summary>
    /// <returns></returns>
    public override string ToString()
    {
        //Create new StringBuilder object
        StringBuilder sb = new StringBuilder();

        sb.Append("Artist Name");

        //Display error if Artist is not available
        if (_artist == null || _artist == "")
        {
            sb.Append("\nNo Artist Entered");
        }
        else
        {
            sb.Append("\n" + this._artist);
        }

        sb.Append("\n");
        sb.Append("\nAlbum Name");

        //Display error if Album is not available
        if (_album == null || _album == "")
        {
            sb.Append("\nNo Album Entered");
        }
        else
        {
            sb.Append("\n" + this._album);
        }

        sb.Append("\n");
        sb.Append("\nTrack Name");
        sb.Append("\n");

        //Iterate through all tracks stored in list
        foreach (string trackName in _track)
        {
            //Print each artist
            sb.Append("\n" + trackName);
        }

        sb.Append("\nEnd of CD Record.........");

        return sb.ToString();
    }

    #endregion
}

这是 CompilationCD 类:

using System;

使用 System.Collections.Generic; 使用 System.Linq; 使用系统文本;

命名空间 CDCollection { 公开课 CompilationCD : CD { #区域字段

    private readonly string _artist;
    private readonly string _album;
    private List<KeyValuePair<string,string>> _tracks = new List<KeyValuePair<string,string>>();

    //List<KeyValuePair> Reference.
    //http://msdn.microsoft.com/en-us/library/6sh2ey19(VS.85).aspx

    #endregion

    #region Constructors

    public CompilationCD()
    {
        _album = "";
        _artist = "Various Artists";
    }

    public CompilationCD(string albumName):base(albumName)
    {
        _album = albumName;
        _artist = "Various Artists";
    }

    #endregion

    public void AddTracks(string track, string artist)
    {
        _tracks.Add(new KeyValuePair<string, string>(track, artist));
    }

    #region Properties

    public override string Artist
    {
        get
        {
            return this._artist;
        }
    }

    public new List<KeyValuePair<string,string>> Track
    {
        get
        {
            return _tracks;
        }
        set
        {
            _tracks = value;
        }
    }


    #endregion

    #region ToString()

    //TEST
    public override string ToString()
    {
        //Create new StringBuilder object
        StringBuilder sb = new StringBuilder();

        sb.Append("Artist Name");

        //Display error if Artist is not available
        if (_artist == null || _artist == "")
        {
            sb.Append("\nNo Artist Entered");
        }
        else
        {
            sb.Append("\n" + this._artist);
        }

        sb.Append("\n");
        sb.Append("\nAlbum Name");

        //Display error if Album is not available
        if (base.Album == null || base.Album == "")
        {
            sb.Append("\nNo Album Entered");
        }
        else
        {
            sb.Append("\n" + base.Album);
        }

        sb.Append("\n");
        sb.Append("\nTrack Name");
        sb.Append("\n");

        ////Iterate through all tracks stored in list
        //foreach (string trackName in base.Track)
        //{
        //    //Print each artist
        //    sb.Append("\n" + trackName);
        //}

        for(int i = 0; i <= _tracks.Count; i++)
        {
            string track = _tracks[i].Key;
            string artist = _tracks[i].Value;

            sb.Append("\nTrack");
            sb.Append(track);
            sb.Append("\nArtist");
            sb.Append(artist);
        }

        sb.Append("\nEnd of Compilation CD Record.........");

        return sb.ToString();
    }

    #endregion
}

我有严格的规则,这意味着我必须继承 CD 来创建我的 CompilationCD 以及使用 List> 作为我的轨道收藏,它需要同时包含轨道和艺术家。我知道疯了 =/

此外,我必须将所有类型的 cd 存储在类型为 CD ( List ) 的列表中。

最佳答案

为什么不用字典?它们是键值对列表,但可以通过键轻松访问。

关于c# - 从 List<KeyValuePair<string,string>> 返回匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1793472/

相关文章:

c# - 我怎样才能使这段代码更优化

java - java 按最近日期从列表中检索数据

R:使用 lapply 将 data.frame 中的值用作列表的子集元素

python - 在 python 列表中计算日期的最佳/最快方法

hadoop - PIG 按最近年份筛选

c# - 调试器可以告诉我 foreach 循环的计数/状态吗?

xml - XSLT - XML中每个元素中每个属性的总和与for-each?

c# - 如何使用 Wix 工具集为 ASP.NET Core 应用程序创建 MSI 安装程序

c# - 为什么运算符 '==' 不能应用于结构和默认值(结构)?

c# - 在静态类中有状态是不好的做法吗?