我从数据库中获取了大量数据,这些数据来自搜索功能。现在我有一个List<string[]>
,其中包含string[]
类型的重复元素。列表中的string[]
是搜索结果。
我知道每个新创建的数组都有不同的实例,因此我无法使用MyListOfArrays.Distinct().ToList()
。
也许这是一个非常基本的问题......
我的问题是,是否有内置任何功能可以删除重复的string[]
表单List<string[]>
?或者我必须自己写一下吗?
谢谢
答案 0 :(得分:3)
您可以将distinct
方法与自定义equalityComparer
IEnumerable<string[]> distinct = inputStringArrayList.Distinct(new EqualityComparer());
<强> EqualityComparer 强>
class EqualityComparer : IEqualityComparer<string[]>
{
public bool Equals(string[] x, string[] y)
{
if (x.Length != y.Length)
{
return false;
}
if (x.Where((t, i) => t != y[i]).Any())
{
return false;
}
return true;
}
public int GetHashCode(string[] obj)
{
return obj.GetHashCode();
}
}
替代等同方法
public bool Equals(string[] x, string[] y)
{
return x.SequenceEqual(y);
}
这里我假设你在相同的索引处拥有完全相同的字符串数组。
的更正public int GetHashCode(string[] obj)
{
if (obj == null)
return 0;
int hash = 17;
unchecked
{
foreach (string s in obj)
hash = hash*23 + ((s == null) ? 0 : s.GetHashCode());
}
return hash;
}
答案 1 :(得分:2)
我已经纠正了@Muctadir Dinar的答案。
(他应该得到答案 - 我只是纠正它并提供完整的测试程序):
using System;
using System.Collections.Generic;
using System.Linq;
namespace Demo
{
sealed class EqualityComparer: IEqualityComparer<string[]>
{
public bool Equals(string[] x, string[] y)
{
if (ReferenceEquals(x, y))
return true;
if (x == null || y == null)
return false;
return x.SequenceEqual(y);
}
public int GetHashCode(string[] obj)
{
if (obj == null)
return 0;
int hash = 17;
unchecked
{
foreach (string s in obj)
hash = hash*23 + ((s == null) ? 0 : s.GetHashCode());
}
return hash;
}
}
class Program
{
private void run()
{
var list = new List<string[]>
{
strings(1, 10),
strings(2, 10),
strings(3, 10),
strings(2, 10),
strings(4, 10)
};
dump(list);
Console.WriteLine();
var result = list.Distinct(new EqualityComparer());
dump(result);
}
static void dump(IEnumerable<string[]> list)
{
foreach (var array in list)
Console.WriteLine(string.Join(",", array));
}
static string[] strings(int start, int count)
{
return Enumerable.Range(start, count)
.Select(element => element.ToString())
.ToArray();
}
static void Main(string[] args)
{
new Program().run();
}
}
}
答案 2 :(得分:1)
一种简单且效率不高的方法是在string.Join
上使用string[]
:
list = list
.GroupBy(strArr => string.Join("|", strArr))
.Select(g => g.First())
.ToList();