#c# #json #linq #.net-core
#c# #json #linq #.net-core
Вопрос:
Привет, может кто-нибудь помочь, пожалуйста, у меня есть список, содержащий мои промо-коды, и в списке я хотел бы возвращать только промо-коды, которые появляются один раз, т.Е. У меня нет дубликатов, см. Ниже Данные из JSON, я хотел бы вернуть промо-коды A123 и B500 и сохранить их в другом списке.
[
{
"PromCode": "A123",
"Priority": 1,
"offer": "Win a Free Cap",
"StartDte": "2020-08-11T00:16:23.184Z",
"endDte": "2020-09-10T17:16:23.184Z",
},
{
"PromCode": "A100",
"Priority": 1,
"offer": "Win a perfume",
"StartDte": "2020-08-11T00:16:23.184Z",
"endDte": "2020-09-10T17:16:23.184Z",
},
{
"PromCode": "A100",
"Priority": 2,
"offer": "Win a Phone pouch",
"StartDte": "2020-09-11T00:16:23.184Z",
"endDte": "2020-10-10T17:16:23.184Z",
},
{
"PromCode": "B500",
"Priority": 1,
"offer": "Win a free router",
"StartDte": "2020-08-11T00:16:23.184Z",
"endDte": "2020-09-10T17:16:23.184Z",
},
]
У меня есть список, содержащий весь этот промокод, как показано ниже
var existingProms = await _Repo.GetAllPromCodes(promCodeList);
я попытался получить те, которые появляются один раз в списке следующим образом
var appearOnce = existingProms.Count(x => existingBnplIndicators.Contains(x.PromCode)).ToList()<2;
var appearOnce = existingProms.where(x=> x.PromCode.Count()).ToList()<2;
Но это не сработало, было возвращено 0 результатов, может кто-нибудь показать, как получить мои два Proms A123, B500 в моем appearOnce lis.Спасибо
Ответ №1:
Вы можете использовать GroupBy
, чтобы получить все результаты, сгруппированные по промокоду. Затем отфильтруйте результаты на основе количества элементов, которые каждая группа должна показывать только тогда, когда Count() == 1
.
Возможно, что-то вроде этого,
public class Class1
{
public string PromCode { get; set; }
public int Priority { get; set; }
public string offer { get; set; }
public DateTime StartDte { get; set; }
public DateTime endDte { get; set; }
}
var obj = JsonConvert.DeserializeObject<List<Class1>>(json);
var singlesOnly = obj.GroupBy(x => x.PromCode).Where(y => y.Count() == 1);
Комментарии:
1. @Jawas Спасибо, что сработало, просто нужно было добавить var singlesOnly = obj . GroupBy(x => x.PromCode). Где(y => y.Count() == 1) . Выберите(x=>x.Key.toString()) . ToList(); для того, чтобы он возвращал singlessOnly в виде списка строк
Ответ №2:
Вы должны сравнивать нужные объекты только с помощью promcode неявно. Посмотрите, как работают Equals и GetHashCode().
using System;
using System.Collections.Generic;
using System.Linq;
namespace test
{
public class TestObj : IEquatable<TestObj>
{
public string Promocode { get; set; }
public int Priority { get; set; }
public string offer { get; set; }
public DateTime StartDate { get; set; }
public DateTime endDate { get; set; }
public override int GetHashCode() => this.Promocode.GetHashCode();
public bool Equals(TestObj other) => Promocode.Equals(other.Promocode);
}
class Program
{
static void Main(string[] args)
{
var a = new TestObj()
{
Promocode = "1",
Priority = 1,
offer = "1",
StartDate = new DateTime(1, 2, 3),
endDate = new DateTime(1, 2, 3)
};
var b = new TestObj()
{
Promocode = "1",
Priority = 1,
offer = "1",
StartDate = new DateTime(1, 2, 3),
endDate = new DateTime(1, 2, 3)
};
var c = new TestObj()
{
Promocode = "2",
Priority = 1,
offer = "1",
StartDate = new DateTime(1, 2, 3),
endDate = new DateTime(1, 2, 3)
};
var list = new List<TestObj>()
{
a,
b,
c
};
var uniqueOnly = list.Distinct();
foreach (var item in uniqueOnly)
{
Console.WriteLine(item.Promocode);
}
}
}
}
Ответ №3:
Сначала определите элементы класса-
public string PromCode { get; set; }
public int Priority { get; set; }
public string offer { get; set; }
public DateTime StartDte { get; set; }
public DateTime endDte { get; set; }
Затем возьмите несколько элементов в списке и используйте функцию distinct () для удаления повторяющихся значений-
static void Main(string[] args)
{
List<TestClass> list = new List<TestClass>()
{
new TestClass(){PromCode="A123",Priority=1,offer="Win a Free
Cap",StartDte=new DateTime(2020-08-11),endDte=new DateTime(2020-09-10)},
new TestClass(){PromCode="A100",Priority=1,offer="Win a
perfume",StartDte=new DateTime(2020-08-11),endDte=new DateTime(2020-09-
10)},
new TestClass(){PromCode="A100",Priority=2,offer="Win a Phone
pouch",StartDte=new DateTime(2020-09-11),endDte=new DateTime(2020-10-10)},
new TestClass(){PromCode="B500",Priority=1,offer="Win a free
router",StartDte=new DateTime(2020-08-11),endDte=new DateTime(2020-09-10)}
};
var finalList = list.Select(b => b.PromCode).Distinct().ToList();
foreach(var item in finalList)
{
Console.WriteLine(item "");
}
Console.Read();
}
}