سؤال

أحاول إنشاء مجموعة من السلاسل في أمر محدد من قبل مجموعة أخرى.يبدو مربكا أنا أعرف لذلك اسمحوا لي أن أشرح

requiredOrderOfElements

{  
[0] category1,  
[1] categoryX,  
[2] something else  
}

موكلي يمر صفيف سلسلة تحتوي على مفتاح وقيمة أي

مرت من العميل

{  
[0][0] categoryX,  
[0][1] value from Category X,  
[1][0] something else,  
[1][1] value for something else,  
[2][0] category1,  
[2][1] value from Category 1  
}

ما أريده هو "قيمة" النصوص في النظام المطلوب من مفاتيح

ما أريد

[0]value from Category 1  
[1]value from Category X  
[2]value for something else 

لقد بحثت في OrderBy / IComparer و لا أرى وسيلة واضحة لتنفيذ ما أريد.بلدي الحل الحالي هو قبيح متداخلة على حلقة

أي أفكار عن طريقة أكثر أناقة سيكون موضع تقدير.

تحديث:- هنا هو اختبار

[TestFixture]
public class GL_Linq_Test
{
    [Test]
    public void CanOrderByAnotherArray()
    {
        var requiredOrder=new[]{"my","required","order"};
        var passedFromClient = new[]
                                   {
                                       new[] {"required", "cat"},
                                       new[] {"order", "dog"},
                                       new[] {"my", "bird"}
                                   };

        var ordered = FunkyOrderer.Order(requiredOrder, passedFromClient);

        Assert.That(ordered.First()[1],Is.EqualTo("bird"));
        Assert.That(ordered.Skip(1).First()[1], Is.EqualTo("cat"));
        Assert.That(ordered.Skip(2).First()[1], Is.EqualTo("dog"));
    }
}

public static class FunkyOrderer
{
//returns order bird,dog,cat not bird,cat,dog        
public static IEnumerable<string[]> Order(string[] requiredOrder, IEnumerable<string[]>passedFromClient)
    {
        return from o in requiredOrder
                     join f in passedFromClient on o equals f[0]
                     orderby o
                     select f;
    }
}
هل كانت مفيدة؟

المحلول

المشكلة هي أنك افتراض مجموعة من السلاسل سوف يكون أمر من قبل مؤشر (لن).ترتيب "my", "order", "required" هو الصحيح باستخدام المدمج في سلسلة comparer.أسهل حل هو تعديل استعلام LINQ أن يأخذ هذا المؤشر بعين الاعتبار عند الطلب.

return from o in requiredOrder.Select((o, i) => new { Value = o, Index = i })
       join f in passedFromClient on o.Value equals f[0]
       orderby o.Index
       select f;

نصائح أخرى

    var orderByThese = new string[] { "category1", "categoryX", "something else" };

    var fromClient = new string[][] 
    {
        new string[] { "categoryX", "value from Category X" },
        new string[] { "something else", "value for something else" },
        new string[] { "category1", "value from Category 1" }
    };

    var joined = from o in orderByThese
                 join f in fromClient on o equals f[0]
                 orderby o
                 select f;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top