私はLinqを初めて使用していて、それに精通しています。私は重複を見つけるために以下のlinqクエリを持っており、それは完全に以下のように動作します:LinqをContainsで使用するとエラーが発生する
// "MergedName"は照会して重複する名前を見つけるデータ列です。
var duplicates = result.AsEnumerable()
`.Select(dr => dr.Field<string("MergedName").Replace("'", "''"))
.GroupBy(x => x)
.Where(g => g.Count() > 1)
.Select(g => g.Key)
.ToList();
foreach (string duplicate in duplicates.ToArray())
{
// Logic to keep one and delete another duplicate.
}
ここで、同じ名前の「MergedName」で類似名を探したいとします。ジョン・スミスとジョン・スミス・ジュニア 私は.Where句で何かを書きましたが、何かが私の構文
var duplicates = result.AsEnumerable()
.Select(dr => dr.Field<string>("MergedName").Replace("'", "''"))
.Where(C => C.Field<string>("MergedName").ToLower().IndexOf(C.Field<string>("MergedName").ToLower().Trim()) != 1)
.Select(g => g.Key)
.ToList();
foreach (string duplicate in duplicates.ToArray())
{
// Logic to keep one and delete another duplicate.
}
エラーと間違っている: - 「文字列 『フィールド』の定義が含まれていないステートメントはどこに例のために そして、最高の拡張メソッドのオーバーロード「System.Data.DatarowExtensions.Fieldは、いくつかの無効な引数」を有している。
あなたはこのコード?または、私が含まれている使用して、類似した名前を見つけることができる他の方法で私を助けてください。
Noxor - 上記のソリューションをありがとうございます、それは正しい方向に役立ちます。私はコレクションの中で同じ人物である2つの名前を持っています: "John Mat Smith"と他のレコードは "John Matthew Smith"です。彼らは同じ人物なので、そのうちの1つを削除します。それは理由です、私はこのリンクにAny.Referredの代わりにContainsを使うことを考えていました: "https://stackoverflow.com/questions/23526773/what-is-the-difference-between-contains-and-any-in- linq "と呼ぶ。似たような名前を最初に照会してリストに入れる方法はありますか?これを早期に明らかにしないことに対する謝罪。 –
オブジェクトの等価メソッドを使用していると思いますので、それをオーバーライドすることができます。同様の名前を持つオブジェクトはtrueを返します。しかし、これは本当に悪い考えのようです。元のコレクションから "複製"レコードを削除したい場合は、文字列だけでなく、重複したオブジェクトのコレクションを保持しようとします。私の答えの編集を参照してください。 – Noxor
あなたは彼らが同じ人であることをどのように知っていますか?あなたが社会保障番号のような他の財産を持っているなら、名前の代わりにグルーピングする方が良いでしょう。 – Noxor