지 중복되는 요소 목록

0

질문

나는 목록이 포함되어 중복 항목입니다.

List<string> filterList = new List<string>()
{
     "postpone", "access", "success", "postpone", "success"
};

을 얻을 출력하는 postpone, access, success 를 사용하여

List<string> filter = filterList.Distinct().ToList();
string a = string.Join(",", filter.Select(a => a).ToArray());
Console.WriteLine(a);

나는 보았을 다른 예로 사용할 수 있습니다 groupby 최신을 얻기 위해 요소의 이후 그들은 다른 항목과 같은 아이디 등을 의미합니다. 지금 나는 단,문자열은 어떻게 받을 수 있는 최신 항목에 목록 access, postpone, success? 어떤 제안이 있으십니까?

c# linq
2021-11-23 10:34:46
4

최고의 응답

2

이렇게 하는 한 가지 방법은 것 사용하여 인덱스의 항목에서는 원래 모음과 함께 GroupBy. 예를 들어,

    var lastDistinct = filterList.Select((x,index)=> new {Value=x,Index=index})
                                 .GroupBy(x=>x.Value)
                                 .Select(x=> x.Last())
                                 .OrderBy(x=>x.Index)
                                 .Select(x=>x.Value);
    var result = string.Join(",",lastDistinct);

출력

access,postpone,success
2021-11-23 10:58:27

주셔서 감사합니다 좋은 예입니다. 돕는다.
yancy
0

입력한 목록의 형식 문자열을 사용하므 groupBy 지 않는 정말 아무것도 추가. 는 경우를 고려하고 있는 코드는,당신의 첫 번째 라인은 당신에게 뚜렷한 목록은,당신은 당신만을 잃는 별개의 항목았기 때문에 문자열입니다.가입 line2. 당신이해야 할 모든 당신은 줄을 추가하기 전에 당신은 참:

List<string> filter = filterList.Distinct().ToList();
string last = filter.LastOrDefault();
string a = string.Join(",", filter.Select(a => a).ToArray());
Console.WriteLine(a);

나는 가정을 만들 수 있는 코드를 더욱 간결하기 때문에 당신이 필요하지 않습니다.선택(a=>a)nor.ToArray()호출에 문자열입니다.입니다.

GroupBy 것 사용되는 경우 당신의 목록을 클래스/구조/녹화/tuple 항목을하고자 할 수 있는 그룹이 특정 키(또는 열쇠)보를 사용하여 고유()에서 온 것입니다. GroupBy 하는 것은 매우 유용하고 배워야 한다는,또한 ToDictionary 및 ToLookup LINQ 도우미 기능이 있습니다.

2021-11-23 10:44:48
0

는 OrderedDictionary 이 작업을 수행합니다. 당신이해야 할 모든 당신은 항목을 추가합과 함께 그것의 논리를"만약 사전에 제거합니다. 추가". OrderedDictionary 보존 순서의 추가하여 그렇게 제거하는 이가 하나하고 다시 추가 이동을 끝 사전

var d = new OrderedDictionary();
filterList.ForEach(x => { if(d.Contains(x)) d.Remove(x); d[x] = null; });

귀하의 d.Keys 지금 문자열 목록

access
postpone
success

OrderedDictionary 에 Collections.Specialized 네임스페이스

는 경우 키를 CSV 로 사용할 수 있습니다 Cast 그들을 설정하는 객체에서 문자열

var s = string.Join(",", d.Keys.Cast<string>());
2021-11-23 18:59:40

감사에 대한 좋은 설명..... 나는 새로운 것'OrderedDictionary'.
yancy
0

그래서 왜 당신이 돌아가 첫 번째는"연기를"? 기 때문에 나중에 순서 당신은 같은 단어는"연기를"다시합니다. 왜 당신이 돌아가 첫 번째 항목의"접속"? 기 때문에 나중에 순서에 보이지 않으면 이 단어는 더 이상.

도:반환하는 경우에 단어의 순서는 없이 단어입니다.

이에 쉬운 것입 LINQ,재귀가 있지만,그것은 매우 효율적인:한 모든 단어는 것을 확인하는의 나머지는 순서를 볼 수는 경우는 단어에서 나머지입니다.

그것은 것 방법을 더 효율적으로 기억하는 가장 높은 지수는 단어를 발견.

의 확장으로 방법입니다. 익숙하지 않은 경우 확장자를 가진 방법을 참조하십시오 extension 방법 분석.

private static IEnumerable<T> FindLastOccurences<T>(this IEnumerable<T> source)
{
    return FindLastOccurrences<T>(source, null);
}

private static IEnumerable<T> FindLastOccurences<T>(this IEnumerable<T> source,
    IEqualityComparer<T> comparer)
{
    // TODO: check source not null
    if (comparer == null) comparer = EqualityComparer<T>.Default;

    Dictionary<T, int> dictionary = new Dictionary<T, int>(comparer);

    int index = 0;
    foreach (T item in source)
    {
        // did we already see this T? = is this in the dictionary
        if (dictionary.TryGetValue(item, out int highestIndex))
        {
            // we already saw it at index highestIndex.
            dictionary[item] = index;
        }
        else
        {
            // it is not in the dictionary, we never saw this item.
            dictionary.Add(item, index);
        }
        ++index;
    }

    // return the keys after sorting by value (which contains the highest index)
    return dictionay.OrderBy(keyValuePair => keyValuePair.Value)
                    .Select(keyValuePair => keyValuePair.Key);
}
         

그래서 모든 항목에 대해 소스 시퀀스에서,우리는지 확인하는 경우 그것은 사전에 있습니다. 하지 않을 경우,우리는 추가 항목으로 키를 사전에 있습니다. 값이 index.

는 경우 그것은 이미 사전에서,다음 값이 최고의 인덱스가 우리는 이 항목을 발견하기 전에. 분명히 현재 지수는 더 높은,그래서 우리는 우리를 교체 가치 사전에 있습니다.

마지막으로 우리는 순서 키의 값 쌍을 사전에 의해 오름차순으로 값을 반환만 키를 사용합니다.

2021-11-23 21:40:54

다른 언어로

이 페이지는 다른 언어로되어 있습니다

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................