比较2个字符串类列表C#

时间:2017-09-14 18:24:00

标签: c# string except tolist

我有一个GinList类,我想比较类

的2个字符串列表
public class GinList
{

    public string GinName;
    public string Country;
    public string Abv;
    public string Price;
    public string Votes;
    public string Stars;

    public GinList(string ginName, string country, string abv, string price, string votes, string stars )
    {
        GinName = ginName;
        Country = country;
        Abv = abv;
        Price = price;
        Votes = votes;
        Stars = stars;
    }
}

然后我填写了gins List ..

public class TestScript : MonoBehaviour 
{
    public string ginString;

    private List< GinList > sortedResults = new List< GinList >();
    private List< GinList > gins = new List< GinList >();
    private string[] splitGinString;

    void Start () 
    {
        splitGinString = ginString.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None);
        // build the new GinList()
        for (var i = 0; i < splitGinString.Length-1; i++)
        {
            gins.Add(new GinList(splitGinString[i], splitGinString[i+1], splitGinString[i+2],
            splitGinString[i+3], splitGinString[i+4], splitGinString[i+5]));
            i+=6;
        }
    }
}

然后调试显示..

0是......第五场比赛 - 西班牙队 - 42.00% - £3.80 - 0 - 0

1是...... Biercee - 比利时 - 44.00% - £4.30 - 0 - 0

2是.. Blackwood - 苏格兰 - 40.00% - £3.60 - 0 - 0

3 is .. Blind Tiger - Piper Cubeba - 比利时 - 47.00% - £4.00 - 0 - 0

4是......布卢姆 - 英格兰 - 42.00% - £3.50 - 0 - 0

等..

然后我做了另一个List,Gins有一些缺失,然后尝试两个..

sortedResults = gins.Except( Gins ).ToList();
sortedResults = Gins.Except( gins ).ToList();

然后一个..

foreach(GinList gin in sortedResults)
{
    Debug.Log("Sorted Gin number " + nextPos + " is .. " + gin.GinName + " - " + gin.Country + " - "
            + gin.Abv + " - " + gin.Price + " - " + gin.Votes + " - " + gin.Stars);
    nextPos++;
}

但Debug显示完整的List,我做错了什么?感谢。

1 个答案:

答案 0 :(得分:4)

您应该阅读documentation for Except

  

默认的相等比较器Default用于比较实现IEqualityComparer泛型接口的类型的值。要比较自定义数据类型,您需要实现此接口并为该类型提供自己的GetHashCode和Equals方法。

简而言之,您需要在类型上实现相等方法。

旁注

在旁注中,您应该使字段公开,而是使用属性来封装字段。您可以使用自动属性为您完成大部分工作,因此您不需要字段+属性。如果不应该在类外设置setter,也可以指定setter为private。如果未在构造函数之外设置c#6.0或更高版本,则可以一起省略set

同样如上所述,您应遵循常见的命名约定。对于属性使用pascal情况。

示例:字段_ginName将成为属性GinName

public string GinName { get; set; }