목록에서 모든 복제본을 찾는 방법은 무엇입니까?
나는 있습니다List<string>
몇 단어가 중복되어 있습니다.저는 중복되는 모든 단어를 찾아야 합니다.
그들을 모두 잡을 수 있는 속임수라도?
.NET 프레임워크 3.5 이상에서 사용할 수 있습니다.Enumerable.GroupBy
중복 키의 열거형을 반환한 다음 카운트가 <=1인 열거형을 필터링한 다음 키를 선택하여 단일 열거형으로 되돌립니다.
var duplicateKeys = list.GroupBy(x => x)
.Where(group => group.Count() > 1)
.Select(group => group.Key);
LINQ를 사용하는 경우 다음 쿼리를 사용할 수 있습니다.
var duplicateItems = from x in list
group x by x into grouped
where grouped.Count() > 1
select grouped.Key;
또는 통사적 설탕을 넣지 않은 것을 선호하는 경우:
var duplicateItems = list.GroupBy(x => x).Where(x => x.Count() > 1).Select(x => x.Key);
이렇게 하면 동일한 모든 요소가 그룹화된 다음 두 개 이상의 요소가 있는 그룹으로만 필터링됩니다.마지막으로 카운트가 필요하지 않기 때문에 해당 그룹에서 키만 선택합니다.
LINQ를 사용하지 않으려면 다음 확장 방법을 사용할 수 있습니다.
public void SomeMethod {
var duplicateItems = list.GetDuplicates();
…
}
public static IEnumerable<T> GetDuplicates<T>(this IEnumerable<T> source) {
HashSet<T> itemsSeen = new HashSet<T>();
HashSet<T> itemsYielded = new HashSet<T>();
foreach (T item in source) {
if (!itemsSeen.Add(item)) {
if (itemsYielded.Add(item)) {
yield return item;
}
}
}
}
이것은 그것이 보고 산출한 항목들을 추적합니다.이전에 항목을 본 적이 없는 경우 항목을 본 항목 목록에 추가하고, 그렇지 않은 경우 항목을 무시합니다.이전에 항목을 생성하지 않은 경우 항목을 생성하고, 그렇지 않은 경우 항목을 무시합니다.
LINQ를 사용하지 않는 경우:
string[] ss = {"1","1","1"};
var myList = new List<string>();
var duplicates = new List<string>();
foreach (var s in ss)
{
if (!myList.Contains(s))
myList.Add(s);
else
duplicates.Add(s);
}
// show list without duplicates
foreach (var s in myList)
Console.WriteLine(s);
// show duplicates list
foreach (var s in duplicates)
Console.WriteLine(s);
보다 일반적인 방법을 찾고 있는 경우:
public static List<U> FindDuplicates<T, U>(this List<T> list, Func<T, U> keySelector)
{
return list.GroupBy(keySelector)
.Where(group => group.Count() > 1)
.Select(group => group.Key).ToList();
}
편집: 예를 들어 보겠습니다.
public class Person {
public string Name {get;set;}
public int Age {get;set;}
}
List<Person> list = new List<Person>() { new Person() { Name = "John", Age = 22 }, new Person() { Name = "John", Age = 30 }, new Person() { Name = "Jack", Age = 30 } };
var duplicateNames = list.FindDuplicates(p => p.Name);
var duplicateAges = list.FindDuplicates(p => p.Age);
foreach(var dupName in duplicateNames) {
Console.WriteLine(dupName); // Will print out John
}
foreach(var dupAge in duplicateAges) {
Console.WriteLine(dupAge); // Will print out 30
}
물론 LINQ를 사용합니다.아래 코드는 문자열로 항목 사전과 원본 목록에 있는 각 항목의 개수를 제공합니다.
var item2ItemCount = list.GroupBy(item => item).ToDictionary(x=>x.Key,x=>x.Count());
제가 할 수 있는 방법은 다음과 같습니다.
List<string> list = new List<string>(new string[] { "cat", "Dog", "parrot", "dog", "parrot", "goat", "parrot", "horse", "goat" });
Dictionary<string, int> wordCount = new Dictionary<string, int>();
//count them all:
list.ForEach(word =>
{
string key = word.ToLower();
if (!wordCount.ContainsKey(key))
wordCount.Add(key, 0);
wordCount[key]++;
});
//remove words appearing only once:
wordCount.Keys.ToList().FindAll(word => wordCount[word] == 1).ForEach(key => wordCount.Remove(key));
Console.WriteLine(string.Format("Found {0} duplicates in the list:", wordCount.Count));
wordCount.Keys.ToList().ForEach(key => Console.WriteLine(string.Format("{0} appears {1} times", key, wordCount[key])));
목록의 각 문자열에 여러 단어가 포함되어 있을 것으로 예상됩니다. 틀리면 알려주세요.
List<string> list = File.RealAllLines("foobar.txt").ToList();
var words = from line in list
from word in line.Split(new[] { ' ', ';', ',', '.', ':', '(', ')' }, StringSplitOptions.RemoveEmptyEntries)
select word;
var duplicateWords = from w in words
group w by w.ToLower() into g
where g.Count() > 1
select new
{
Word = g.Key,
Count = g.Count()
}
문자열에서 중복된 항목을 확인하는 데 다음과 같은 방법을 사용합니다.
public static IEnumerable<string> CheckForDuplicated(IEnumerable<string> listString)
{
List<string> duplicateKeys = new List<string>();
List<string> notDuplicateKeys = new List<string>();
foreach (var text in listString)
{
if (notDuplicateKeys.Contains(text))
{
duplicateKeys.Add(text);
}
else
{
notDuplicateKeys.Add(text);
}
}
return duplicateKeys;
}
아마도 그것은 가장 짧거나 우아한 방법은 아닐 것이지만, 저는 그것이 매우 읽기 쉽다고 생각합니다.
lblrepeated.Text = "";
string value = txtInput.Text;
char[] arr = value.ToCharArray();
char[] crr=new char[1];
int count1 = 0;
for (int i = 0; i < arr.Length; i++)
{
int count = 0;
char letter=arr[i];
for (int j = 0; j < arr.Length; j++)
{
char letter3 = arr[j];
if (letter == letter3)
{
count++;
}
}
if (count1 < count)
{
Array.Resize<char>(ref crr,0);
int count2 = 0;
for(int l = 0;l < crr.Length;l++)
{
if (crr[l] == letter)
count2++;
}
if (count2 == 0)
{
Array.Resize<char>(ref crr, crr.Length + 1);
crr[crr.Length-1] = letter;
}
count1 = count;
}
else if (count1 == count)
{
int count2 = 0;
for (int l = 0; l < crr.Length; l++)
{
if (crr[l] == letter)
count2++;
}
if (count2 == 0)
{
Array.Resize<char>(ref crr, crr.Length + 1);
crr[crr.Length - 1] = letter;
}
count1 = count;
}
}
for (int k = 0; k < crr.Length; k++)
lblrepeated.Text = lblrepeated.Text + crr[k] + count1.ToString();
언급URL : https://stackoverflow.com/questions/4578260/how-to-find-all-duplicate-from-a-liststring
'programing' 카테고리의 다른 글
합계가 있는 요약 행 추가 (0) | 2023.07.14 |
---|---|
angular7에서 항목 목록을 표시할 때 매트 선택의 높이를 변경하려면 어떻게 해야 합니까? (0) | 2023.07.14 |
Mongodb 배경 인덱스 - 한 번 생성된 배경 인덱스가 여전히 있습니까? (0) | 2023.07.09 |
v-switch 또는 확인란을 클릭하면 Vuejs가 클릭한 행을 다른 테이블로 이동합니다. (0) | 2023.07.09 |
세 개의 테이블을 안쪽 접합 (0) | 2023.07.09 |