문자열 배열 목록이 있습니다. 문자열 배열의 첫 번째 요소에 대해서만 검사를 수행하여 중복 및 빈 문자열을 제거하려고합니다. IEqualityComparer를 사용하여 일부 게시물을 보았습니다. 중복 제거는 전체 문자열 배열을 비교하여보다 우아하고 잠재적으로 더 효율적으로 보이게합니다. 그러나 IEqualityComparer가 나를 혼란시키기 때문에 원하지 않는 요소를 제거하기 위해 문자열 배열의 첫 번째 요소에서만이를 확인하는 데 실패했습니다. 더 우아하게 어떻게이 일을 성취 할 수 있습니까? 나의 현재 비 우아한 & 비 효율적인 작업 코드 :C# 중복 제거에만 문자열 배열의 첫 번째 요소를 확인
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]);
}
그리고이 난 단지 문자열 배열의 첫 번째 항목에 체크 할 구현하기 위해 노력 비 작동 코드 :
sealed class EqualityComparer: IEqualityComparer<string[]>
{
public bool Equals(string[] x, string[] y)
{
if (ReferenceEquals(x[0], y[0]))
return true;
if (x == null || y == null)
return false;
return x[0].SequenceEqual(y[0]);
}
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;
}
}
작성자
var result = list.Distinct(new EqualityComparer());
나는 한 줄의 해결책이기 때문에 대답으로 받아들이고 있습니다. 메이트 - 최고 녀석! =)이 LINQ 쿼리 내에서 빈 문자열 키가있는 배열을 제거 할 수 있습니까? –
@BarryGuvenkaya 물론, 그룹 앞에 필터를 추가하십시오. 예를 들면 :'input.Where (a =>! string.IsNullOrEmpty (a.FirstOrDefault())) .GroupBy (...'). 빈 배열을 모두 지우고 첫 번째 (그리고/또는 단지) 요소 – Rob