2

どの値が返されるかを優先する場合、列の値に対して条件付き選択を実行するにはどうすればよいですか。最上位の選択肢が見つからない場合は、利用可能な場合は次の選択肢に落ち着き、そうでない場合は次の選択肢に落ち着きます。現在のように、合計 3 つのクエリが必要になります。これをさらに単純化する方法はありますか?

var myResult = string.Empty;

if (myTable.Where(x => x.ColumnValue == "Three").Any())
{
    myResult = "Three"; // Can also be some list.First().Select(x => x.ColumnValue) if that makes it easier;
}
else if (myTable.Where(x => x.ColumnValue == "One").Any())
{
    myResult = "One";
}
else if (myTable.Where(x => x.ColumnValue == "Two").Any())
{
    myResult = "Two";
}
else
{
    myResult = "Four";
}
4

4 に答える 4

7

string[]好みにa を使用できます。

string[] prefs = new[]{ "One", "Two", "Three" };
string myResult = prefs.FirstOrDefault(p => myTable.Any(x => x.ColumnValue == p));
if(myResult == null) myResult = "Four";

Edit Enumerable.Join非常に効率的なハッシュ テーブル メソッドであり、必要なクエリも 1 つだけです。

string myResult = prefs.Select((pref, index) => new { pref, index })
    .Join(myTable, xPref => xPref.pref, x => x.ColumnValue, (xPref, x) => new { xPref, x })
    .OrderBy(x => x.xPref.index)
    .Select(x => x.x.ColumnValue)
    .DefaultIfEmpty("Four")
    .First();

デモ

于 2013-08-14T21:49:59.883 に答える
2

SQL で加重アプローチを使用して、各条件値に加重を割り当てます。解決策は、注文スキームに応じて最大または最小の重みを見つけることによって見つかります。

以下は、同等の LINQ クエリです。この例では、低い重みに高い優先度を割り当てていることに注意してください。

void Main()
{
    // Assume below list is your dataset 
    var myList =new List<dynamic>(new []{
    new {ColumnKey=1, ColumnValue  ="Two"},
    new {ColumnKey=2, ColumnValue  ="Nine"},
    new {ColumnKey=3, ColumnValue  ="One"},
    new {ColumnKey=4, ColumnValue  ="Eight"}});

    var result = myList.Select(p => new 
                            {
                                ColVal =    p.ColumnValue,
                                OrderKey =  p.ColumnValue == "Three" ? 1 : 
                                            p.ColumnValue == "One"   ? 2 : 
                                            p.ColumnValue == "Two"   ? 3 : 4
                             }).Where(i=> i.OrderKey != 4)
                             .OrderBy(i=>i.OrderKey)
                             .Select(i=> i.ColVal)
                             .FirstOrDefault();

    Console.WriteLine(result ?? "Four");
}
于 2013-08-14T23:13:23.380 に答える
0

このようなものはどうですか:

var results = myTable.GroupBy(x => x.ColumnValue).ToList();

if (results.Contains("Three")) {
    myResult = "Three"; 
} else if (results.Contains("One")) {
    myResult = "One";
} else if (results.Contains("Two")) {
    myResult = "Two";
} else {
    myResult = "Four";
}
于 2013-08-14T21:50:16.823 に答える