在锯齿状的字符串数组中查找异常(C#)

时间:2011-06-28 20:00:42

标签: c# arrays string rows

我有一些数据,我读到一个锯齿状的字符串数组。这种数组的一个例子:

string[] row = { "John", "Apple", "Orange", "Banana" };

我将有一个数组来保存这些字符串行。很长的一个。

我想要做的是找到所有具有相同名称的行(“ John ”)。然后比较这些行以查看它们是否相同。如果有任何例外,请打印所有这些,否则继续使用下一个名称。

例如,如果我有10行“ John ”,我想检查其中所有10行的属性是否完全是“ Apple ”,“ 橙色“和”香蕉“。除了“ John ”之外,我还有数以千计的名字,我想做同样的事情。

有没有一种有效的算法来做到这一点?我将用C#编写它。

1 个答案:

答案 0 :(得分:0)

使用Linq,您可以执行以下操作:

var rows = new string[][]
{
    new string[] {"John", "Apple", "Orange", "Banana"},
    new string[] {"John", "Apple", "Orange", "Banana"},
    new string[] {"John", "Apple", "Lemon", "Banana"},
    new string[] {"John", "Apple", "Orange", "Grape"},
    new string[] {"Sam", "Apple", "Orange", "Banana"},
    new string[] {"Sam", "Apple", "Orange", "Banana"},
};

var results = (from f in rows
              where f.Contains("Sam")
              select f).Distinct(new ArrayComparer());

但是,这需要创建自定义比较器类,如下所示:

class ArrayComparer : IEqualityComparer<string[]>
{
    public bool Equals(string[] x, string[] y)
    {
        if (x.Length != y.Length)
            return false;

        var left = x.OrderBy(s => s).ToArray();
        var right = y.OrderBy(s => s).ToArray();

        for (int index = 0; index < x.Length; index++)
        {
            if (left[index] == right[index])
            {
                continue;
            }
            else
            {
                return false;
            }
        }

        return true;
    }

    public int GetHashCode(string[] obj)
    {
        int hash = 23;
        foreach (var element in obj.OrderBy(s => s))
        {
            hash = hash * 37 + element.GetHashCode();
        }

        return hash;
    }
}

使用John的结果将是3行,而Sam的结果将是2行。如果您想忽略大小写,则只需将OrderBy(s => s)更改为OrderBy(s => s, StringComparer.OrdinalIgnoreCase)

即可