Humster
Humster

Reputation: 1

Merge data from two arrays or something else

How to combine Id from the list I get from file /test.json and id from list ourOrders[i].id? Or if there is another way?

private RegionModel FilterByOurOrders(RegionModel region, List<OurOrderModel> ourOrders, MarketSettings market, bool byOurOrders)
{
    var result = new RegionModel
    {
        updatedTs = region.updatedTs,
        orders = new List<OrderModel>(region.orders.Count)
    };

    var json = File.ReadAllText("/test.json");
    var otherBotOrders = JsonSerializer.Deserialize<OrdersTimesModel>(json);
    OtherBotOrders = new Dictionary<string, OrderTimesInfoModel>();

    foreach (var otherBotOrder in otherBotOrders.OrdersTimesInfo)
    {
        //OtherBotOrders.Add(otherBotOrder.Id, otherBotOrder);
        BotController.WriteLine($"{otherBotOrder.Id}"); //Output ID orders to the console works
    }

    foreach (var order in region.orders)
    {
        if (ConvertToDecimal(order.price) < 1 || !byOurOrders)
        {
            int i = 0;
            var isOurOrder = false;
            while (i < ourOrders.Count && !isOurOrder)
            {
                if (ourOrders[i].id.Equals(order.id, StringComparison.InvariantCultureIgnoreCase))
                {
                    isOurOrder = true;
                }
                ++i;
            }
            if (!isOurOrder)
            {
                result.orders.Add(order);
            }
        }
    }
    return result;
}

OrdersTimesModel Looks like that:

public class OrdersTimesModel
{
    public List<OrderTimesInfoModel> OrdersTimesInfo { get; set; }
}

test.json:

{"OrdersTimesInfo":[{"Id":"1"},{"Id":"2"}]}

Added:
I'll try to clarify the question:
There are three lists with ID:
First (all orders): region.orders, as order.id
Second (our orders): ourOrders, as ourOrders[i].id in a while loop
Third (our orders 2): from the /test.json file, as an array {"Orders":[{"Id":"12345..."...},{"Id":"12345..." ...}...]}

There is a foreach in which there is a while, where the First (all orders) list and the Second (our orders) list are compared. If the id's match, then these are our orders: isOurOrder = true;
Accordingly, those orders that isOurOrder = false; will be added to the result: result.orders.Add(order)

I need:
So that if (ourOrders[i].id.Equals(order.id, StringComparison.InvariantCultureIgnoreCase)) would include more Id's from the Third (our orders 2) list.
Or any other way to do it?

Upvotes: 0

Views: 62

Answers (1)

Facundo Gallardo
Facundo Gallardo

Reputation: 384

You should be able to completely avoid writing loops if you use LINQ (there will be loops running in the background, but it's way easier to read)

You can access some documentation here: https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/linq/introduction-to-linq-queries

and you have some pretty cool extension methods for arrays: https://learn.microsoft.com/en-us/dotnet/api/system.linq.enumerable?view=net-6.0 (these are great to get your code easy to read)

Solution

unsing System.Linq;

private RegionModel FilterByOurOrders(RegionModel region, List<OurOrderModel> ourOrders, MarketSettings market, bool byOurOrders)
{
    var result = new RegionModel
    {
        updatedTs = region.updatedTs,
        orders = new List<OrderModel>(region.orders.Count)
    };

    var json = File.ReadAllText("/test.json");
    var otherBotOrders = JsonSerializer.Deserialize<OrdersTimesModel>(json);

    // This line should get you an array containing 
    // JUST the ids in the JSON file
    var idsFromJsonFile = otherBotOrders.Select(x => x.Id);

    // Here you'll get an array with the ids for your orders
    var idsFromOurOrders = ourOrders.Select(x => x.id);

    // Union will only take unique values,
    // so you avoid repetition.
    var mergedArrays = idsFromJsonFile.Union(idsFromOurOrders);

    // Now we just need to query the region orders
    // We'll get every element that has an id contained in the arrays we created earlier
    var filteredRegionOrders = region.orders.Where(x => !mergedArrays.Contains(x.id));

    result.orders.AddRange(filteredRegionOrders );

    return result;
}

You can add conditions to any of those actions (like checking for order price or the boolean flag you get as a parameter), and of course you can do it without assigning so many variables, I did it that way just to make it easier to explain.

Upvotes: 1

Related Questions