2015-01-26 5 views
3

그래서 클래스의 개체 목록이 있습니다. 이 목록에서 나는 Table.name == "value"C# 목록에서 개체 가져 오기 object.value 같음

Class Table{ 

    public string name; 
    private string primarykey; 
    private string[] columnNames; 

    //some methods and functions 
} 

내 질문은, 예를 들어 LINQ이 목록에서 지정된 개체를 얻을 수있는 효율적인 방법이 어디 개체를 얻을 수 원하거나 I를 기본 검색 알고리즘으로이를 통해 단지 루프를 않습니다.

foreach(Table t in tables) 
{ 
    if(t.name == "value") 
     return t; 
} 

그래서 예를 들어 LINQ이 할 수있는 더 효율적인 방법이 : 내 말은 기본 검색 알고리즘으로와

?

+4

linq이 코드를 마술처럼 빠르게 만들지 않습니다. 따라서 tables.Single (t => t.name == "value")를 사용할 수는 있지만 더 빠르지는 않습니다. – sloth

+0

더 빨리 이해할 수 있지만 linq을 사용하면 더 읽기 쉽도록 만들었습니다 – kpp

+0

효율성보다 더 많은 가독성에 관심이 있으시면 다음 번에 질문에 "효율적인" 두 번 질문에,하지만 당신은 실제로 더 단순한 코드를 원하는 언급하지 마십시오. –

답변

10

은 쉽게 LINQ와 함께 할 수 있지만,보다 효율적으로되지 않습니다 : 그 기준에 일치 테이블이없는 경우

var match = tables.FirstOrDefault(t => t.name == value); 

지금 matchnull 될 것입니다. 이 경우에 당신이 원하는 것을 해결해야합니다.

LINQ 코드는 더 짧지 만 일치하는 항목을 찾을 때까지 목록의 모든 테이블을 반복해야합니다.

테이블에 이름을 매핑하려면 Dictionary<string, Table>을 고려해 볼 수 있습니다.하지만 분명히 그 이름 당 하나의 테이블 만 있으면됩니다. 또한 테이블이 많지 않으면 실제로 더 빠를 수 없습니다. O (n) 대신에 O (1) (해시 충돌이 없다고 가정)이지만, n이 작 으면 O (n)은 꽤 빠릅니다. 나는 이것이 실제로 병목 현상인지 여부를 확인하기 전에 이것이 병목인지 여부를 확인하는 것이 좋습니다.

+0

나는 LINQ가 그의 코드를 더 빠르게 만들지 않을 것이라고 언급 할 가치가 있다고 믿는다. –

+3

@HossamBarakat : 내가 한 것처럼, 두번. –

+2

4 분 전에 답변 했음 4 분 전에 응답했습니다. Skeet이 다시 공격합니다. –

관련 문제