C#   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c# – 从列表中返回匹配>大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我目前有一个类使用带有List的KeyValuePair来存储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类型的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;
使用System.Collections.Generic;
使用System.Linq;
使用System.Text;

命名空间CDCollection
{
    公共课CD
    {
        #region Fields
        private readonly String _artist;
        private readonly String _album;
        private List _track = new List();
        #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;
使用System.Text;

命名空间CDCollection
{
    公共类编译CD:CD
    {
        #region Fields

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

    //List<KeyValuePair> Reference.
    //@R_801_10107@://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)类型的列表中.

解决方法

问题出在你的foreach循环中. tempComCols是List< CD>,但comCD是KeyValuePair< String,String>.因此,您的循环导致无效的类型转换.

不幸的是,由于我们不知道CD类(接口?)是什么样的,我不能建议修复它的属性.

编辑:以下可能是您的方法的更好版本(但是,我没有正确调试它):

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

    temp = _cdCollection.Where(cd => cd is CompilationCD)
                        .Cast<CompilationCD>()
                        .Where(com_cd => com_cd.Tracks.ContainsKey(track))
                        .FirstOrDefault();

    if (temp != null)
        return temp;
    else throw new Argumentexception("No matches found");
}

你不能将CompilationCD转换为KeyValuePair< String,String>,所以我们只是直接使用COR_507_11845@pilationCD类.我们可以将搜索轨道列表的责任转移到IEnumerable< T> System.Linq提供的扩展方法,使这个方法非常简单.

大佬总结

以上是大佬教程为你收集整理的c# – 从列表中返回匹配>全部内容,希望文章能够帮你解决c# – 从列表中返回匹配>所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。