괄호 사이의 항목이 double
으로 변환 가능한지 확인합니다. 그렇지 않으면 -1을 반환합니다.
var numbers = strings.Select(x => x.Substring(x.IndexOf("(") + 1,
x.IndexOf(")") - x.IndexOf("(") - 1)).Select(x =>
{
double val;
if(double.TryParse(x, out val)) {
return val;
}
// Or whatever you want to do
return -1;
}).OrderBy(x => x); // Or use OrderByDescending
당신은 항상 짧은 그대로 다음이를 사용, 괄호 사이의 숫자가있을 것입니다 확실한 경우 :
내가 원래 문자열이 필요
var numbers = strings.Select(
x => x.Substring(x.IndexOf("(") + 1, x.IndexOf(")") - x.IndexOf("(") - 1))
.Select(x => double.Parse(x))
.OrderBy(x => x); // Or use OrderByDescending
편집 , 그냥 그 숫자를 주문했다.
var items = strings.OrderBy(
x => double.Parse(x.Substring(x.IndexOf("(") + 1,
x.IndexOf(")") - x.IndexOf("(") - 1)));
어떻게 OO 접근 방식에 대해 :
은 기본적으로 당신이 할 필요는 OrderBy
에 술어를 통과하여 그 번호로 주문을 얘기하는 것입니다?
우리는 문자열을 주문하지만 숫자처럼 취급해야합니다. 우리가 방금 OrderBy
라고 부를 수있는 방법이 있다면 그것은 좋지 않을까요? 그것은 우리를 위해 주문합니까? 잘있다. OrderBy
메서드는 IComparable<T>
(있는 경우)을 사용합니다. jpg 경로를 보유하고 IComparable<T>
인터페이스를 구현하는 클래스를 생성 해 봅시다. 위의 방법에 대한 좋은 무엇
public class CustomJpg : IComparable<CustomJpg>
{
public CustomJpg(string path)
{
this.Path = path;
}
public string Path { get; private set; }
private double number = -1;
// You can even make this public if you want.
private double Number
{
get
{
// Let's cache the number for subsequent calls
if (this.number == -1)
{
int myStart = this.Path.IndexOf("(") + 1;
int myEnd = this.Path.IndexOf(")");
string myNumber = this.Path.Substring(myStart, myEnd - myStart);
double myVal;
if (double.TryParse(myNumber, out myVal))
{
this.number = myVal;
}
else
{
throw new ArgumentException(string.Format("{0} has no parenthesis or a number between parenthesis.", this.Path));
}
}
return this.number;
}
}
public int CompareTo(CustomJpg other)
{
if (other == null)
{
return 1;
}
return this.Number.CompareTo(other.Number);
}
}
우리가 OrderBy
를 계속 전화하는 경우, 그것은 개방 (
및 )
종료와 수의 해석마다하고 검색 할 필요가 없습니다 것입니다. 처음 호출 될 때 캐시에 저장 한 다음 계속 사용합니다. 다른 좋은 점은 Path
속성과 Number
속성을 바인딩 할 수 있다는 것입니다 (액세스 수정자를 private에서 변경해야 함). 축소판 이미지를 보유하고 바인딩 할 수있는 새 속성을 도입 할 수도 있습니다. 보시다시피이 접근법은 훨씬 더 유연하고 깨끗하며 OO 방식입니다. 숫자를 찾기위한 코드도 한 곳에 있으므로 ()
에서 다른 기호로 전환하면 한 곳에서 변경됩니다. 또는 ()
을 찾기 위해 수정할 수 있으며 찾지 못하면 다른 기호를 찾습니다.
List<CustomJpg> jpgs = new List<CustomJpg>
{
new CustomJpg("some-name-(1).jpg"),
new CustomJpg("some-name-(5).jpg"),
new CustomJpg("some-name-(5.1).jpg"),
new CustomJpg("some-name-(6).jpg"),
new CustomJpg("some-name-(12).jpg")
};
var ordered = jpgs.OrderBy(x => x).ToList();
당신은 어떤 개체에 대해이 방법을 사용할 수 있습니다 여기에
은 사용입니다.
[이] (http://stackoverflow.com/a/7215364/4802649) 도움이 될 수있다. – Phiter
또는 다른 솔루션은 https://www.bing.com/search?q=c%23+natural+sort에서 찾을 수 있습니다. 표준 중복 타겟 http://stackoverflow.com/questions/248603/natural-sort-order -in-c-sharp는 시작하기에 충분한 정보를 제공합니다.이 질문에 대한 답은 좀 더 자세한 정보가 있습니다 - http://stackoverflow.com/a/3717036/477420 –