条件 - c# list 重複チェック linq




C#のList<T>から重複を削除する (16)

LinqのUnionメソッドを使用します。

注:このソリューションはLinqについての知識は必要ありません。

コード

まず、クラスファイルの先頭に以下を追加します。

using System.Linq;

これで、 obj1という名前のオブジェクトから重複を削除することができます:

obj1 = obj1.Union(obj1).ToList();

注: obj1の名前をオブジェクトの名前に変更します。

使い方

  1. Unionコマンドは、2つのソースオブジェクトの各エントリの1つをリストします。 obj1は両方のソースオブジェクトであるため、obj1は各エントリの1つになります。

  2. ToList()は新しいListを返します。 UnionようなLinqコマンドは、元のListを変更したり、新しいListを返す代わりに、結果をIEnumerableの結果として返すため、これは必要です。

誰でもC#でジェネリックリストを重複排除する簡単な方法がありますか?


.Net 2.0の別の方法

    static void Main(string[] args)
    {
        List<string> alpha = new List<string>();

        for(char a = 'a'; a <= 'd'; a++)
        {
            alpha.Add(a.ToString());
            alpha.Add(a.ToString());
        }

        Console.WriteLine("Data :");
        alpha.ForEach(delegate(string t) { Console.WriteLine(t); });

        alpha.ForEach(delegate (string v)
                          {
                              if (alpha.FindAll(delegate(string t) { return t == v; }).Count > 1)
                                  alpha.Remove(v);
                          });

        Console.WriteLine("Unique Result :");
        alpha.ForEach(delegate(string t) { Console.WriteLine(t);});
        Console.ReadKey();
    }

David J.の答えは良い方法で、余分なオブジェクトやソートなどは必要ありませんが、これは改善することができます:

for (int innerIndex = items.Count - 1; innerIndex > outerIndex ; innerIndex--)

したがって、外側のループはリスト全体のトップボトムになりますが、内側のループは外側のループ位置に達するまでボトムになります。

外側のループは、リスト全体が処理され、内側のループが実際の重複を検出し、外側のループがまだ処理していない部分でのみ発生することができます。

または、内側ループのボトムアップをしたくない場合は、outerIndex + 1で内側ループを開始できます。


Javaでは(私はC#が多かれ少なかれ同じであると仮定します):

list = new ArrayList<T>(new HashSet<T>(list))

本当に元のリストを変更したい場合は:

List<T> noDupes = new ArrayList<T>(new HashSet<T>(list));
list.clear();
list.addAll(noDupes);

順序を保持するには、単にHashSetをLinkedHashSetに置き換えます。


MoreLINQ使用してMoreLINQパッケージをインストールすると、 MoreLINQ簡単に別のオブジェクトリストを作成できます

IEnumerable<Catalogue> distinctCatalogues = catalogues.DistinctBy(c => c.CatalogueCode); 

HashSetを同じ型のListで初期化するだけです。

var noDupes = new HashSet<T>(withDupes);

リストを返す場合は、次のようにします。

var noDupsList = new HashSet<T>(withDupes).ToList();

ここでは、読みにくいLINQや以前のリストの並べ替えを必要としない単純なソリューションがあります。

   private static void CheckForDuplicateItems(List<string> items)
    {
        if (items == null ||
            items.Count == 0)
            return;

        for (int outerIndex = 0; outerIndex < items.Count; outerIndex++)
        {
            for (int innerIndex = 0; innerIndex < items.Count; innerIndex++)
            {
                if (innerIndex == outerIndex) continue;
                if (items[outerIndex].Equals(items[innerIndex]))
                {
                    // Duplicate Found
                }
            }
        }
    }

それは私のために働いた。 単に使用する

List<Type> liIDs = liIDs.Distinct().ToList<Type>();

"Type"を希望のタイプ、例えばintに置き換えます。


どのように: -

var noDupes = list.Distinct().ToList();

ネットで3.5?


ヘルパーメソッド(Linqなし):

public static List<T> Distinct<T>(this List<T> list)
{
    return (new HashSet<T>(list)).ToList();
}

拡張メソッドは適切な方法かもしれません...このようなもの:

public static List<T> Deduplicate<T>(this List<T> listToDeduplicate)
{
    return listToDeduplicate.Distinct().ToList();
}

そして、たとえば次のように呼び出します。

List<int> myFilteredList = unfilteredList.Deduplicate();

直感的な簡単な実装

public static List<PointF> RemoveDuplicates(List<PointF> listPoints)
{
    List<PointF> result = new List<PointF>();

    for (int i = 0; i < listPoints.Count; i++)
    {
        if (!result.Contains(listPoints[i]))
            result.Add(listPoints[i]);
        }

        return result;
    }

解決する方法はたくさんあります。リストの重複問題は、以下のうちの1つです。

List<Container> containerList = LoadContainer();//Assume it has duplicates
List<Container> filteredList = new  List<Container>();
foreach (var container in containerList)
{ 
  Container duplicateContainer = containerList.Find(delegate(Container checkContainer)
  { return (checkContainer.UniqueId == container.UniqueId); });
   //Assume 'UniqueId' is the property of the Container class on which u r making a search

    if(!containerList.Contains(duplicateContainer) //Add object when not found in the new class object
      {
        filteredList.Add(container);
       }
  }

乾杯Ravi Ganesan


重複がリストに追加されていないことを確認する方が簡単かもしれません。

if(items.IndexOf(new_item) < 0) 
    items.add(new_item)

順序を気にしない場合は、項目をHashSetに押し込むだけで、順序を維持たい場合は次のようにすることができます。

var unique = new List<T>();
var hs = new HashSet<T>();
foreach (T t in list)
    if (hs.Add(t))
        unique.Add(t);

またはLinqの方法:

var hs = new HashSet<T>();
list.All( x =>  hs.Add(x) );

編集: HashSetメソッドはO(N) O(N*lgN)時間とO(1) O(N*lgN) O(1)スペースですので、ソートしてからユニークな(@ lassevkなどで提案されているように) O(N*lgN)時間とO(1)ソート方法が劣っていることを私にはっきりとわかりました(一時的な投票の謝罪...)


  public static void RemoveDuplicates<T>(IList<T> list )
  {
     if (list == null)
     {
        return;
     }
     int i = 1;
     while(i<list.Count)
     {
        int j = 0;
        bool remove = false;
        while (j < i && !remove)
        {
           if (list[i].Equals(list[j]))
           {
              remove = true;
           }
           j++;
        }
        if (remove)
        {
           list.RemoveAt(i);
        }
        else
        {
           i++;
        }
     }  
  }




generics