2017-11-30 3 views
-1

都市名と都市名の都市リストがあり、LinQを使用してフィルタに一致するすべての列を並べ替える必要があります。例えばlinqを使用してC#のすべての列をアルファベット順に並べ替えます(可能な場合)

CITY_NAME | CITY COUNTRY 
-------------+--------------- 
Buenos Aires | Argentina 
Asuncion  | Paraguay 
Sydney  | Australia 
Abadeh  | Iran 
Acero  | Bolivia 

私は.StartsWithに「」の文字が、その後のすべての列が、最初のCity_CountryとCITY_NAMEを考慮し、またアルファベット順にを照合することによってソートされたリストを取得したいです。

結果は次のようになります。

Buenos Aires | Argentina 
Sydney  | Australia 
Abadeh  | Iran 
Acero  | Bolivia 
Asuncion  | Paraguay 

この:

.OrderBy(city => city.CITY_COUNTRY).ThenBy(city => city.CITY_NAME) 

は名前で国別および後の最初の注文以来、動作しないと私はのような結果を得るでしょう:

Buenos Aires | Argentina 
Sydney  | Australia 
Acero  | Bolivia 
Abadeh  | Iran 
Asuncion  | Paraguay 

これは間違っています。A badeh |イランはより良い一致します cero |ボリビア。

私は可能な限り明確にしようとしました。あなたが同じ国に2つの都市があった場合

おかげ

+0

私は完全な答えのための時間がありません(そして、私はテストしなかったので、それは十分ではありません)が、正しい方向に移動する必要があります。 (City => new Tuple (city.CITY_COUNTY))。OrderBy(item =>新しいタプル(city.CITY_NAME)最後の 'Distinct()'は固着点であり、LINQ to Objectsは順序を維持し、他のLINQプロバイダはそうではない可能性があります。 –

+1

"アルファベット順 "とは何ですか?列や列の意味"シドニー、オーストラリア "はなぜ" Abadeh、Iran "の前に来たのですか?"オーストラリア "は" Abadeh " ? – NetMage

+0

ニュージーランドの都市ウェリントンの場合、@RodriFerryにはどこが表示されるのですか、それともAで始まらないので表示されないのですか? – mjwills

答えて

-1

ThenByは、それが国をソートするので、それらの国々内の都市をソートし、任意の違いを生むだろう。また、あなたのリストにはオーストラリアのパースを持っていた場合

たとえば、その後、次のように設定します。

Buenos Aires | Argentina 
Perth | Australia 
Sidney | Australia 
Acero | Bolivia 
Abadeh | Iran 
Asuncion | Paraguay 

あなたは都市や国の値のいずれかでソートしたい場合は、その後、最初に来ます

.OrderBy(city => string.Compare(city.CITY_COUNTRY, city.CITY_NAME) < 0 ? city.CITY_COUNTRY : city.CITY_NAME) 

私はそれがあなたの期待するリストを与えると思います。

+0

解決策を使って自分の答えを更新しました –

+0

「A」ではなく「B」の文字を検索したとしましょうブエノスアイレスを結果の最初の行にしたい)。このコードはそうするでしょうか? – mjwills

+0

正確ではありません。私のコードはアルファベットの最初のもの(都市名または国名)のどちらかを使用します。しかし、特定の文字を使いたい場合は簡単に変更できます。 –

-1

私はあなたが(それが"A"プレフィックスと一致するかどうかに依存する)CityまたはCountryのいずれかを含む新しい列を投影し、その後その新しい列で注文する必要があり疑います。 1つの可能なアプローチは、のようになります。

using System; 
using System.Collections.Generic; 
using System.Linq; 

namespace TestConsole 
{ 
    public class Program 
    { 
     public class CountryAndCity 
     { 
      public string Country { get; set; } 
      public string City { get; set; } 
     } 

     static void Main(string[] args) 
     { 
      var cities = new List<CountryAndCity> 
      { 
       new CountryAndCity() {Country = "Australia", City = "Sydney"}, 
       new CountryAndCity() {Country = "Argentina", City = "Buenos Aires"}, 
       new CountryAndCity() {Country = "Paraguay", City = "Asuncion"}, 
       new CountryAndCity() {Country = "Abadeh", City = "Iran"} 
      }; 

      // The important bit starts here 
      var results = cities 
       .Where(z => z.Country.StartsWith("A") || z.City.StartsWith("A")) // this line is optional (only needed if you want to remove those that don't start with A 
       .Select(z => 
        new 
        { 
         OriginalData = z, 
         Match = z.Country.StartsWith("A") ? z.Country : z.City.StartsWith("A") ? z.City : "ZZZZZZ" 
        }) 
       .OrderBy(z => z.Match) 
       .Select(z => z.OriginalData); 
      // The important bit ends here 

      Console.WriteLine(string.Join("\r\n", results.Select(z => $"{z.Country}-{z.City}"))); 

      Console.ReadLine(); 
     } 
    } 
} 
1

私はそれが簡単にStartsWith結果をキャッシュするために作るために理解を照会するラムダ構文からの切り替え:

var ans = from city in Cities 
      let countrysw = city.COUNTRY_NAME.StartsWith("A") 
      let citysw = city.CITY_NAME.StartsWith("A") 
      where countrysw || citysw 
      orderby citysw,(countrysw ? city.COUNTRY_NAME : city.CITY_NAME) 
      select city; 

基本的には、との開始のための国や都市をテストしますマッチしたものを最初に国のマッチ(真の前に偽の並べ替え)、次に一致する名前でマッチさせます。

+0

OPはCity over Countryと言っているので、国では「Australia」と分類されると思います。 – NetMage

+0

なぜそうですか。 – NetMage

+0

@mjwills私は適切に一緒に選択/ソートするためにクエリを書き直しました。 – NetMage

-1
yourList.Where(x => x.CITY_COUNTRY.StartsWith("A")).OrderBy(x => x.CITY_COUNTRY) 
        .Concat(yourList.Where(x => x.CITY_NAME.StartsWith("A") && !x.CITY_COUNTRY.StartsWith("A")).OrderBy(x => x.CITY_NAME)); 

基本的には、Aで始まるすべての国を選択して並べ替える必要があります。 Aから始まるすべての都市と連動しますが、重複を避けるために国がAで始まらないようにしてください。

+0

"Aと"で始まるものだけが私に暗示されている "フィルタと一致する"は、結果にあるはずです。 – NetMage

+0

@NetMage ok。その場合、私は残りの部分すべてを連結する最後の部分を削除しました – Steve

関連する問題