我有一些数据,我读到一个锯齿状的字符串数组。这种数组的一个例子:
string[] row = { "John", "Apple", "Orange", "Banana" };
我将有一个数组来保存这些字符串行。很长的一个。
我想要做的是找到所有具有相同名称的行(“ John ”)。然后比较这些行以查看它们是否相同。如果有任何例外,请打印所有这些,否则继续使用下一个名称。
例如,如果我有10行“ John ”,我想检查其中所有10行的属性是否完全是“ Apple ”,“ 橙色“和”香蕉“。除了“ John ”之外,我还有数以千计的名字,我想做同样的事情。
有没有一种有效的算法来做到这一点?我将用C#编写它。
答案 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)