C#仅通过检查字符串数组的第一个元素来删除重复项

C#仅通过检查字符串数组的第一个元素来删除重复项,c#,iequalitycomparer,C#,Iequalitycomparer,我有一个字符串数组列表。我想通过仅对字符串数组的第一个元素进行检查来删除重复项和空字符串。我看到过一些SO帖子使用IEqualityComparer来实现删除重复项,比较整个字符串数组,我认为这会使它看起来更优雅,可能更高效。但是,我无法仅在字符串数组的第一个元素上检查它以删除不需要的元素,因为IEqualityComparer让我感到困惑。我怎样才能更优雅地做到这一点?我当前的非优雅和非高效工作代码: void method(List<string[]> contactAndNum

我有一个字符串数组列表。我想通过仅对字符串数组的第一个元素进行检查来删除重复项和空字符串。我看到过一些SO帖子使用IEqualityComparer来实现删除重复项,比较整个字符串数组,我认为这会使它看起来更优雅,可能更高效。但是,我无法仅在字符串数组的第一个元素上检查它以删除不需要的元素,因为IEqualityComparer让我感到困惑。我怎样才能更优雅地做到这一点?我当前的非优雅和非高效工作代码:

void method(List<string[]> contactAndNumber)
{
    List<string[]> contactAndNumberSanitized = new List<string[]>();
    contactAndNumberSanitized.Clear();
    bool rem = false;
    List<int> remList = new List<int>();
    for (int i = 0; i < contactAndNumber.Count; i++)
    {
        contactAndNumberSanitized.Add(new string[] { contactAndNumber[i][0], contactAndNumber[i][1] });
        for (int j = 0; j < contactAndNumberSanitized.Count; j++)
            if (i != j)
                if (contactAndNumber[i][0] == contactAndNumberSanitized[j][0])
                {
                    rem = true;
                    break;
                }
        if (rem || string.IsNullOrEmpty(contactAndNumber[i][0]))
            remList.Add(i);
        rem = false;
    }
    for (int i = remList.Count - 1; i >= 0; i--)
        contactAndNumberSanitized.RemoveAt(remList[i]);
}

您的代码可以大大简化:

var input = new List<string[]> { new[] { "a", "b" }, new[] { "a", "c" }, new[] { "c", "d" }};
var result = input.GroupBy(l => l.FirstOrDefault()).Select(g => g.First());
var input=newlist{new[]{“a”,“b”},new[]{“a”,“c”},new[]{“c”,“d”};
var result=input.GroupBy(l=>l.FirstOrDefault()).Select(g=>g.First());
这将为您提供唯一的数组,使用每个数组的第一个元素来确定唯一性


但是,由于您使用数组的第一个元素来确定唯一性,因此空集的边缘情况被视为等价于
{null}
。根据处理空集的方式,您需要修改代码以过滤输入,或者更改
GroupBy

您的代码可以大大简化:

var input = new List<string[]> { new[] { "a", "b" }, new[] { "a", "c" }, new[] { "c", "d" }};
var result = input.GroupBy(l => l.FirstOrDefault()).Select(g => g.First());
var input=newlist{new[]{“a”,“b”},new[]{“a”,“c”},new[]{“c”,“d”};
var result=input.GroupBy(l=>l.FirstOrDefault()).Select(g=>g.First());
这将为您提供唯一的数组,使用每个数组的第一个元素来确定唯一性


但是,由于您使用数组的第一个元素来确定唯一性,因此空集的边缘情况被视为等价于
{null}
。根据处理空集的方式,您需要修改代码以过滤输入,或者更改
GroupBy

,因为您使用的是列表,所以可以使用RemoveAll方法

编辑:原始答案可能不起作用。修订如下

编辑2:实际上,如果要删除所有重复项(而不保留原始项),请使用以下命令:

var duplicates = data.Where(x => x == null || string.IsNullOrEmpty(x[0]) || data.Where(y => y != null).Count(y => y[0] == x[0]) > 1).ToList();
data.RemoveAll(x => duplicates.Contains(x));
但是,如果您想在一组副本中保留最后一个(例如,在一组三个“a”中保留最后一个“a”),那么您可以使用我的原始答案:

data.RemoveAll(x => x == null || string.IsNullOrEmpty(x[0]) || data.Where(y => y != null).Count(y => y[0] == x[0]) > 1);

由于您使用的是列表,因此可以使用RemoveAll方法

编辑:原始答案可能不起作用。修订如下

编辑2:实际上,如果要删除所有重复项(而不保留原始项),请使用以下命令:

var duplicates = data.Where(x => x == null || string.IsNullOrEmpty(x[0]) || data.Where(y => y != null).Count(y => y[0] == x[0]) > 1).ToList();
data.RemoveAll(x => duplicates.Contains(x));
但是,如果您想在一组副本中保留最后一个(例如,在一组三个“a”中保留最后一个“a”),那么您可以使用我的原始答案:

data.RemoveAll(x => x == null || string.IsNullOrEmpty(x[0]) || data.Where(y => y != null).Count(y => y[0] == x[0]) > 1);

我接受这个答案,因为这是一个单线解决方案。伙伴-头号人物!=)删除带有空字符串键的数组也可以在这个LINQ查询中实现吗?@BarryGuvenkaya当然可以,您应该在group by之前添加一个过滤器。例如:
input.Where(a=>!string.IsNullOrEmpty(a.FirstOrDefault()).GroupBy(…
)。这将删除所有空数组,以及将
null
作为第一个(和/或唯一)元素的数组。我接受这一个作为答案,因为它是一行解决方案。Mate-top bloke!=)删除带有空字符串键的数组也可以在这个LINQ查询中实现吗?@BarryGuvenkaya当然可以,您应该在group by之前添加一个过滤器。例如:
input.Where(a=>!string.IsNullOrEmpty(a.FirstOrDefault()).GroupBy(…
),它将删除所有空数组,以及第一个(和/或仅)为
null
的数组元素不幸的是,这对我不起作用。无论如何,谢谢你的快速回答。不幸的是,这对我不起作用。无论如何,谢谢你的快速回答。