programing

루프를 사용하지 않고 관찰 가능한 컬렉션에서 항목 찾기

golfzon 2023. 4. 29. 10:06
반응형

루프를 사용하지 않고 관찰 가능한 컬렉션에서 항목 찾기

현재 다음과 같은 구문을 사용하고 있습니다(목록은 다양한 속성을 가진 개체를 포함하는 목록입니다(여기서 Title은 그 중 하나입니다).

for (int i=0; i < list.Count; i++)
{
   if(title == list[i].Title)
   {
    //do something
   }
}

어떻게 액세스할 수 있습니까?list[i].Title내 컬렉션 전체를 루프할 필요 없이?목록이 커지는 경향이 있기 때문에 프로그램 성능에 영향을 줄 수 있습니다.

프로그램 전반에 걸쳐 유사한 구문을 많이 사용하고 있습니다(루프 및 인덱스를 위해 공용 속성에 액세스).하지만 저는 이것을 하는 더 좋고 우아한 방법이 있을 것이라고 확신합니다.

목록에 개체가 포함되어 있기 때문에 찾기 방법이 선택사항인 것 같습니다.

정확히 무슨 말인지는 모르겠지만 엄밀히 말하면 루프가 없으면 불가능합니다.

다음과 같은 LINQ를 사용하는 것을 의미할 수 있습니다.

list.Where(x=>x.Title == title)

반복을 건너뛰는 것이 아니라 LINQ 쿼리로 압축된다는 점을 언급할 필요가 있습니다.

이게 도움이 되길 바랍니다.

편집

즉, 성능에 대해 정말로 걱정하는 경우에는 이미 수행한 방식으로 코딩을 계속하십시오.그렇지 않으면 보다 간결하고 명확한 구문을 위해 LINQ를 선택합니다.

린크가 왔습니다.

var listItem = list.Single(i => i.Title == title);

술어와 일치하는 항목이 없는 경우 예외가 발생합니다.또는 다음과 같은 방법이 있습니다.SingleOrDefault.

제목과 일치하는 항목 모음을 원하는 경우 다음이 있습니다.

var listItems = list.Where(i => i.Title ==  title);

인덱스가 필요하지 않으면 조건 추가를 위해 사용해야 했습니다.

using System.Linq;

사용하다

if(list.Any(x => x.Title == title){
// do something here
}

주어진 조건을 만족하는 변수가 있는지 여부를 알려줍니다.

해시 테이블에 저장하는 것이 좋습니다.그런 다음 키를 사용하여 컬렉션의 항목에 액세스할 수 있으므로 훨씬 효율적인 조회가 가능합니다.

var myObjects = new Hashtable();
myObjects.Add(yourObject.Title, yourObject);
...
var myRetrievedObject = myObjects["TargetTitle"];

인덱스를 만드는 것을 고려해 보십시오.사전이 그 묘기를 부릴 수 있습니다.목록 의미론이 필요한 경우 인덱스를 하위 클래스로 분류하고 개인 멤버로 유지합니다.

관찰 가능한 컬렉션은 목록이므로 요소 위치를 모를 경우 예상되는 요소를 찾을 때까지 각 요소를 살펴봐야 합니다.

가능한 최적화 요소가 정렬된 경우 이진 검색을 사용하여 성능을 개선하거나 사전을 색인으로 사용합니다.

관찰 가능한 컬렉션이 아닌 해시 기반 컬렉션(예: 사전 또는 해시 집합)을 찾고 있습니다.해시 기반 컬렉션에서 파생하여 관찰 가능한 컬렉션과 동일한 동작을 제공하는 INOTIFYCollectionChanged를 구현하는 것이 가장 좋은 솔루션일 수 있습니다.

만약 당신이 N개의 객체를 가지고 있고 모든 객체의 제목을 얻어야 한다면 당신은 루프를 사용해야 합니다.제목만 필요한데 이를 개선하려면 제목만 포함된 별도의 배열을 만들면 성능이 향상될 수 있습니다.사용 가능한 메모리 양과 처리할 수 있는 개체 양을 정의해야 성능이 손상될 수 있으며, 어떤 경우에도 알고리즘이 아닌 프로그램 설계가 변경됩니다.

이 접근 방식이 문제를 해결할 수 있을 것입니다.

int result = obsCollection.IndexOf(title);

Of 인색(T)
지정한 개체를 검색하고 전체 컬렉션 내에서 첫 번째 항목의 0 기반 인덱스를 반환합니다.

( Collection에서 상속됨)

https://learn.microsoft.com/en-us/dotnet/api/system.collections.objectmodel.observablecollection-1?view=netframework-4.7.2#methods

관찰 가능한 컬렉션은 목록일 수 있습니다.

{
    BuchungsSatz item = BuchungsListe.ToList.Find(x => x.BuchungsAuftragId == DGBuchungenAuftrag.CurrentItem.Id);
}

언급URL : https://stackoverflow.com/questions/10498325/find-item-in-observablecollection-without-using-a-loop

반응형