codememo

목록 C#에 중복 요소 추가 안 함

tipmemo 2023. 10. 30. 21:01
반응형

목록 C#에 중복 요소 추가 안 함

string[] lines3 = new string[100];
List<string> lines2 = new List<string>();
lines3 = Regex.Split(s1, @"\s*,\s*");

if (!lines2.Contains(lines3.ToString()))
{
    lines2.AddRange(lines3.Distinct().ToArray());
}

나는 모든 칸 등을 확인했지만 여전히 내 라인에 중복된 값이 있습니다.2List

나는 여기서 나의 중복된 가치를 제거해야만 합니다.

Enumerable을 사용할 수 있습니다.2행에 없는 3행에서 구별되는 항목을 가져오는 것을 제외하고:

lines2.AddRange(lines3.Except(lines2));

라인 2에 라인 3의 모든 항목이 포함되어 있으면 아무것도 추가되지 않습니다.BTW 내부적으로 사용 제외Set<string>두 번째 시퀀스에서 구별되는 항목을 얻고 첫 번째 시퀀스에 존재하는 항목을 확인합니다.그래서 굉장히 빠릅니다.

이 수표는 다음과 같습니다.

if (!lines2.Contains(lines3.ToString()))

유효하지 않습니다.당신은 당신이 당신의.lines2포함하다System.String[]부터lines3.ToString()당신에게 그것을 줄 것입니다.당신은 품목이 다음의.lines3에 존재합니다.lines2그렇지 않으면.

각 항목을 반복할 수 있습니다.lines3에 존재하는지 확인합니다.lines2추가합니다.뭔가.

foreach (string str in lines3)
{
    if (!lines2.Contains(str))
        lines2.Add(str);
}

아니면 당신의lines2빈 목록입니다. 그러면 간단히 추가할 수 있습니다.lines3다음과 같이 목록에 고유한 값을 지정합니다.

lines2.AddRange(lines3.Distinct());

그럼 당신의lines2서로 다른 값을 포함합니다.

사용.HashSet<string>대신에List<string>. 어떤 항목에 대해서도 체크를 해주지 않아도 되기 때문에 더 좋은 성능을 발휘할 수 있도록 준비되어 있습니다.컬렉션에서 관리해 드릴 겁니다.그것이 a의 차이점입니다.list그리고.set. 샘플의 경우:

HashSet<string> set = new HashSet<string>();

set.Add("a");
set.Add("a");
set.Add("b");
set.Add("c");
set.Add("b");
set.Add("c");
set.Add("a");
set.Add("d");
set.Add("e");
set.Add("e");

var total = set.Count;

총계는5그리고 그 값은.a,b,c,d,e.

의 실행.List<T>기본적으로 제공하지 않습니다.당신은 할 수 있지만, 당신은 이 통제권을 제공해야 합니다.샘플의 경우, 이것은extension method:

public static class CollectionExtensions
{
    public static void AddItem<T>(this List<T> list, T item)
    {
       if (!list.Contains(item))
       {
          list.Add(item);
       }
    }
}

사용:

var list = new List<string>();
list.AddItem(1);
list.AddItem(2);
list.AddItem(3);
list.AddItem(2);
list.AddItem(4);
list.AddItem(5);

목록에 중복되는 것을 원하지 않으면 a를 사용합니다. 그렇게 하면 코드를 읽는 다른 사람에게 당신의 의도가 무엇이었는지 명확해질 것이고 이후로 당신은 코드를 쓸 일이 줄어들 것입니다.HashSet사용자가 수행하려는 작업을 이미 처리합니다.

당신은 간단한 것을 사용할 수 있습니다.Union+Distinct:

var lines = lines2.Union(lines3).Distinct();

그러면 두 번째 목록의 모든 항목이 첫 번째 목록에 추가된 다음 결합 목록의 모든 고유 문자열이 반환됩니다.큰 목록에서는 성능이 좋지 않지만 간단합니다.

참조 : http://msdn.microsoft.com/en-us/library/bb341731.aspx

만약 당신의 수표가 효과가 있었다면, 그것은 모든 품목을 추가했거나 아예 추가하지 않았을 것입니다.하지만, 전화를 걸면ToStringmethod on array는 배열의 내용이 아닌 데이터 유형의 이름을 반환하며,Contains메서드는 항목 모음이 아닌 단일 항목만 찾을 수 있습니다.

배열의 각 문자열을 확인해야 합니다.

string[] lines3;
List<string> lines2 = new List<string>();

lines3 = Regex.Split(s1, @"\s*,\s*");

foreach (string s in lines3) {
  if (!lines2.Contains(s)) {
    lines2.Add(s);
  }
}

그러나 빈 목록으로 시작하는 경우에는Distinct중복을 제거하는 메소드이며, 한 줄의 코드만 있으면 됩니다.

List<string> lines2 = Regex.Split(s1, @"\s*,\s*").Distinct().ToList();

다른 값을 컬렉션에 저장하려면 HashSet Class를 시도해 볼 수 있습니다.중복된 값을 자동으로 제거하여 코딩 시간을 절약할 수 있습니다.:)

사용하다HashSet낫습니다

여기를 보세요. http://www.dotnetperls.com/hashset

을 합니다.HashSet당신의 것과 함께List:

List<string> myList = new List<string>();
HashSet<string> myHashSet = new HashSet<string>();

public void addToList(string s) {
    if (myHashSet.Add(s)) {
        myList.Add(s);
    }
}

myHashSet.Add(s)돌아올 것입니다true한다면s존재하지 않습니다.

#Felipe Oriani에서 힌트를 얻어, 여기서 영원히 공유하고 싶은 확장자를 만들었습니다.

public static class CollectionExtension
{
    public static void AddUniqueItem<T>(this List<T> list, T item, bool throwException)
    {
        if (!list.Contains(item))
        {
            list.Add(item);
        }
        else if(throwException)
        {
            throw new InvalidOperationException("Item already exists in the list");
        }
    }
    public static bool IsUnique<T>(this List<T> list, IEqualityComparer<T> comparer)
    {
        return list.Count == list.Distinct(comparer).Count();
    }
    public static bool IsUnique<T>(this List<T> list)
    {
        return list.Count == list.Distinct().Count();
    }
}

좋은 방법은 아니지만 빠른 수정 같은 것이 있습니다. 전체 목록에 중복되는 항목이 있는지 확인하기 위해 bool을 사용합니다.

bool containsKey;
string newKey;

public void addKey(string newKey)
{
    foreach (string key in MyKeys)
    {
        if (key == newKey)
        {
            containsKey = true;
        }
    }

    if (!containsKey)
    {
        MyKeys.add(newKey);
    }
    else
    {
        containsKey = false;
    }
}

언급URL : https://stackoverflow.com/questions/14433332/avoid-adding-duplicate-elements-to-a-list-c-sharp

반응형