40
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

ここで重複する値を削除する必要があります

4

11 に答える 11

62

Enumerable.Exceptを使用して、lines2 にない lines3 から個別のアイテムを取得できます。

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

lines2 に lines3 のすべての項目が含まれている場合、何も追加されません。ところで、Except は内部Set<string>的に、2 番目のシーケンスから個別のアイテムを取得し、最初のシーケンスに存在するアイテムを検証するために使用します。だから、それはかなり速いです。

于 2013-01-21T06:34:51.803 に答える
44

あなたのこのチェック:

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異なる値が含まれます。

于 2013-01-21T06:28:24.807 に答える
40

HashSet<string>の代わりに a を使用しList<string>ます。アイテムのチェックを提供する必要がないため、より良いパフォーマンスを実行する準備ができています。コレクションがそれを管理します。listそれが aと aの違い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で、値はabcdです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);
于 2016-01-22T20:12:08.370 に答える
5

リストに重複を入れたくない場合は、HashSet. そうすれば、あなたのコードを読んでいる他の人にあなたの意図が明確になり、HashSetあなたがやろうとしていることをすでに処理しているので、書くコードが少なくなります。

于 2013-01-21T06:32:54.747 に答える
3

単純なUnion+を使用できますDistinct:

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

これにより、2 番目のリストのすべての項目が最初のリストに追加され、結合されたリスト内のすべての一意の文字列が返されます。大きなリストではうまく機能しない可能性がありますが、単純です。

参照: http://msdn.microsoft.com/en-us/library/bb341731.aspx

于 2013-01-21T06:35:50.940 に答える
2

チェックが機能した場合、すべてのアイテムが追加されるか、まったく追加されないかのいずれかです。ただし、配列でメソッドを呼び出すとToString、配列の内容ではなく、データ型の名前が返されます。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メソッドを使用して重複を削除でき、必要なコードは 1 行だけです。

List<string> lines2 = Regex.Split(s1, @"\s*,\s*").Distinct().ToList();
于 2013-01-21T06:33:19.373 に答える
2

個別の値をコレクションに保存したい場合は、HashSet Classを試すことができます。重複する値が自動的に削除され、コーディング時間が節約されます。:)

于 2013-01-21T06:38:02.530 に答える
1

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

于 2016-12-14T09:21:59.337 に答える